
前回はプロジェクト「0075_ronri_enzan」を新しく作り、フラグ管理をするためのbool型の論理演算と特徴をお話ししました。
今回は、新しくプロジェクト「0080_hikaku_enzan」を作り、比較演算についてお話します。比較演算とは、 数値同士を比較して真(しん)か偽(ぎ)かの答えを返す演算のこと です。例として、ゲームでは敵の攻撃で「主人公の体力が0以下になった」などの条件分岐で使ったりもします。
この記事を読む前に前提として論理演算について知っておく必要があるので、わからない方は 一つ前のページ を見ていただければと思います。。
ではでは比較演算を行うサンプルプログラムを作成して、比較演算がどのようなものかを確認していきましょう。
今回はプロジェクト「0080_hikaku_enzan」を新しく用意し、プロジェクトに空の「OperateComparation.c」を追加し、下のソースコードをコピペして動かしてみましょう。
#include <stdio.h>
#include <stdbool.h>
int main() {
bool flag1 = ( 3 < 4 );
bool flag2 = ( 3 > 4 );
bool flag3 = ( 6 <= 6 );
bool flag4 = ( 0 >= -2 );
bool flag5 = ( 3 == 4 );
bool flag6 = ( 5 == 5 );
bool flag7 = ( 1 != 4 );
bool test = 100;
// 結果を表示してみます。
printf("3 < 4 の結果は %d\n", flag1 );
printf("3 > 4 の結果は %d\n", flag2 );
printf("6 <= 6 の結果は %d\n", flag3 );
printf("0 >= -2 の結果は %d\n", flag4 );
printf("3 == 4 の結果は %d\n", flag5 );
printf("5 == 5 の結果は %d\n", flag6 );
printf("1 != 4 の結果は %d\n", flag7 );
}
コピペなりして、実行してみて下さい。
3 < 4 の結果は 1
3 > 4 の結果は 0
6 <= 6 の結果は 1
0 >= -2 の結果は 1
3 == 4 の結果は 0
5 == 5 の結果は 1
1 != 4 の結果は 1
こんな結果になりました。 今回ソースコードの中で、 6 つの比較演算子を使用しています。
それぞれ使い方と意味を表にしてみます。
演算子 | 使い方の例 | 比較演算した結果 |
---|---|---|
< | a < b | b が a より大きいとき結果は 1(true)となる。違うなら 0(false)となる。 |
> | a > b | a が b より大きいとき結果は 1(true)となる。違うなら 0(false)となる。 |
<= | a <= b | b が a 以上のとき結果は 1(true)となる。違うなら 0(false)となる。 |
>= | a >= b | a が b 以上のとき結果は 1(true)となる。違うなら 0(false)となる。 |
== | a == b | a と b が等しいとき結果は 1(true)となる。違うなら 0(false)となる。 |
!= | a != b | a と b が等しくないなら結果は 1(true)となる。違うなら 0(false)となる。 |
実際にソースコードの中でのそれぞれの演算子の使い方を見ていきましょう
bool flag1 = ( 3 < 4 );
bool型の変数 flag1 に、右辺の結果を代入しています。
bool型については前ページでお話しましたが、true(整数 1) か、false(整数 0)を代入することができます。
右辺の式には、3 < 4 とあります。 これは正しいので、1 ( true ) が結果となり、左辺の flag1 には 1 ( true ) が代入されます。
次の行を見てみましょう。
bool flag2 = ( 3 > 4 )
この右辺の式 ( 3 > 4 ) は間違っているので、 0 ( false ) が結果となり、左辺の flag2 には 0 ( false ) が代入されます。
bool flag3 = ( 6 <= 6 );
bool flag4 = ( 0 >= -2 );
6行目の右辺では、 6 ≦ 6 を計算してます。これは正しいので 1 ( true ) となります。 ASCIIコード上では記号「≦」は登録されていないので、「<」と「=」の二文字で比較を表現 しています。
記号は「<」→「=」の順で書く必要があります。 「=」→「<」の順番が正しく、順番を間違えて「=<」と書くとエラーになってしまうのでご注意ください。
7行目の右辺では 0 ≧ -2 を計算しています。これは正しいので 1 ( true ) となります。
の比較も2文字で書く必要があり、イコールの記号はあとになります。
ですので、注意してください。
※といっても、ビルド(コンパイル)するときに分かりやすいエラーメッセージがでるので、すぐ直せるかと思います。
bool flag5 = ( 3 == 4 );
bool flag6 = ( 5 == 5 );
bool flag7 = ( 1 != 4 );
8 行目では 3 == 4 で、整数 3 と 4 が等しいかを比較計算しています。 記号「=」を2回連続で並べることで、等しいかの比較演算子として機能する ので注意してください。
3 ≠ 4 ですので、結果は 0 ( false ) となります。
9 行目では 5 == 5 は正しいので 1 ( true ) となりますね。
10行目の記号「!」は 否定(NOT)を意味します。つまり「!=」は "等しくないとき"という意味となります。 右辺の「1 != 4」は 1 ≠ 4 という意味ですので、結果は 1 ( true ) となります。
記号「==」であれば比較を行いますが、記号「=」だけだと右辺の結果を左辺に代入する、という意味となり、 比較してくれないので注意が必要です。 この書き間違えは一見わかりにくく、時々やっかいな(そしてしょうもない)バグの原因になります。
よくあるような間違えの書き方と結果についてみてみましょう。
例えば、「体力の変数 hp が 0 なら変数 hpzero に 1 ( true ) を代入する」ことをしたいとき、下のようなコードは書き間違えです。
int hp = 100;
bool hpzero = ( hp = 0 );
正しくは
bool hpzero = ( hp == 0 );
で体力の変数 hp が 0 と等しいかをチェックできます。文法上エラーとならないので、見つかりにくいですし、注意する必要があるので気を付けてくださいね。
[[ info|補足]] この間違った書き方を実行すると、右辺 ( hp = 0 ) が実行されたとき、変数 hp に数字 0 が代入されます。 この( hp = 0 ) の処理(代入)が成功すると、 ( hp = 0 ) の結果は true となります。 つまり、右辺の結果は 1 ( true ) となりますので、bool型変数の hpzero には 1 ( true ) が代入されることになります。 こんな風に、誤って書くと、「体力が 0 じゃないのに、hpzero が 1 ( true ) になったりして、おかしな挙動となる」ことが考えられます。こわいこわい。
今回はここまで。お疲れさまでした。
更新日 | 更新内容 |
---|---|
更新なし |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: