第2章11 比較演算を使えるようになる@イチからゲーム作りで覚えるC言語

C言語で比較演算

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章12 if文 条件で実行する処理を分ける
NEXT : 2章12 if文 条件で実行する処理を分ける
2章10 論理演算(BOOL演算) : PREV

この記事でやること

前回はプロジェクト「0075_ronri_enzan」を新しく作り、フラグ管理をするためのbool型の論理演算と特徴をお話ししました。
今回は、新しくプロジェクト「0080_hikaku_enzan」を作り、比較演算についてお話します。比較演算とは、数値同士を比較して(しん)か(ぎ)かの答えを返す演算のことです。例として、ゲームでは敵の攻撃で「主人公の体力が0以下になった」などの条件分岐で使ったりもします。

論理演算について知っておく必要があるので、わからない方は一つ前のページを見るとよいかもです。

この記事はゆる~くC言語でコンソールゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

比較演算をするプログラム

ではでは比較演算を行うサンプルプログラムを作成して、比較演算がどのようなものかを確認していきましょう。
今回はプロジェクト「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文字で書く必要があり、イコールの記号はあとになります。

  • a >= b … 正しい書き方。 a ≧ b を比較する。
  • a => b … 間違った書き方。エラーになる。

ですので、注意してください。
※といっても、ビルド(コンパイル)するときに分かりやすいエラーメッセージがでるので、すぐ直せるかと思います。

演算子「==」「!=」の例と解説

 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 と等しいかをチェックできます。文法上エラーとならないので、見つかりにくいですし、注意する必要があるので気を付けてくださいね。

補足:この間違った書き方を実行すると、右辺 ( hp = 0 ) が実行されたとき、変数 hp に数字 0 が代入され、代入が成功したことで、右辺の結果は 1 ( true ) となります。bool型変数の hpzero には 1 ( true ) が代入されることになります。
こんな風に、誤って書くと、「体力が 0 じゃないのに、hpzero が 1 ( true ) になったりして、おかしな挙動となる」ことが考えられます。こわいこわい。

あとがき

今回はここまで。お疲れさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章12 if文 条件で実行する処理を分ける
NEXT : 2章12 if文 条件で実行する処理を分ける
2章10 論理演算(BOOL演算) : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日 更新内容
更新なし