Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2018年7月3日に更新

第2章11 比較演算を使えるようになる

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

この記事でやること

前回はプロジェクト「0075_ronri_enzan」を新しく作り、フラグ管理をするためのbool型の論理演算と特徴をお話ししました。

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

この記事を読む前に前提として論理演算について知っておく必要があるので、わからない方は 一つ前のページ を見ていただければと思います。。

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

ではでは比較演算を行うサンプルプログラムを作成して、比較演算がどのようなものかを確認していきましょう。

今回はプロジェクト「0080_hikaku_enzan」を新しく用意し、プロジェクトに空の「OperateComparation.c」を追加し、下のソースコードをコピペして動かしてみましょう。

 
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 );
}

コピペなりして、実行してみて下さい。

OperateComparation.c
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)となる。

それぞれの比較演算子の使い方

実際にソースコードの中でのそれぞれの演算子の使い方を見ていきましょう

演算子「<」、「>」の例と解説

 
OperateComparation.c
 bool flag1 = ( 3 < 4 );

bool型の変数 flag1 に、右辺の結果を代入しています。

bool型については前ページでお話しましたが、true(整数 1) か、false(整数 0)を代入することができます。

右辺の式には、3 < 4 とあります。 これは正しいので、1 ( true ) が結果となり、左辺の flag1 には 1 ( true ) が代入されます。

次の行を見てみましょう。

 
OperateComparation.c
 bool flag2 = ( 3 > 4 )

この右辺の式 ( 3 > 4 ) は間違っているので、 0 ( false ) が結果となり、左辺の flag2 には 0 ( false ) が代入されます。

演算子「<=」「>=」の例と解説

 
OperateComparation.c
 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 … 間違った書き方。エラーになる。

ですので、注意してください。

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

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

 
OperateComparation.c
 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 が代入されます。 この( hp = 0 ) の処理(代入)が成功すると、 ( hp = 0 ) の結果は true となります。 つまり、右辺の結果は 1 ( true ) となりますので、bool型変数の hpzero には 1 ( true ) が代入されることになります。 こんな風に、誤って書くと、「体力が 0 じゃないのに、hpzero が 1 ( true ) になったりして、おかしな挙動となる」ことが考えられます。こわいこわい。

あとがき

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

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

ページの更新履歴

更新日 更新内容
更新なし
イチからゲーム作りで覚えるC言語
第2章10 論理演算(BOOL演算) : PREV
NEXT : 第2章12 if文 条件で実行する処理を分ける :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

ゲーム等で使えるつなぎ目のないループするテクスチャ画像の作り方

#ツール#ゲームプログラミング✎ 2021-01-24
ゲームなどで使えるループ画像、パターンテクスチャのツール、手動での作り方をまとめ
広告領域
追従 広告領域
目次
第2章11 比較演算を使えるようになる
第2章11 比較演算を使えるようになる
この記事でやること
この記事でやること
比較演算をするプログラム
比較演算をするプログラム
それぞれの比較演算子の使い方
それぞれの比較演算子の使い方
演算子「<」、「>」の例と解説
演算子「<」、「>」の例と解説
演算子「<=」「>=」の例と解説
演算子「<=」「>=」の例と解説
演算子「==」「!=」の例と解説
演算子「==」「!=」の例と解説
よくある比較演算子「==」と代入演算子「=」の書き間違え
よくある比較演算子「==」と代入演算子「=」の書き間違え
あとがき
あとがき
非常に参考になったサイトさまや、参考文献など
非常に参考になったサイトさまや、参考文献など
ページの更新履歴
ページの更新履歴
Nodachisoft © 2020