連載
» 2014年06月11日 10時00分 公開

完全マスター! 組み込みC言語プログラミング(5):【問題4】Cコンパイラはif文をどう裁くのか (2/2)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]
前のページへ 1|2       

関係演算子と等価演算子

 関係演算子は数としての大小を比較する演算子で、>(より大きい)、<(より小さい)、>=(以上)、<=(以下)の4つの演算子があります。これらの演算子の結果はintで、関係が真の場合は1を、偽の場合は0を返します。

 一方、等価演算子には、==(等しい)と!=(等しくない)の2つがあって、関係が真の場合は値を1に、偽の場合は値を0とすることは関係演算子と同じです。

 ただし、関係演算子は等価演算子よりも優先順位が高いので、

a >= 0 == b >= 0

は、「a≧0とb≧0が等しい」と解釈され、結果はaとbの符号が同じ場合は1、異なる場合は0になります。

 しかし、このような記述は読みにくいので、かっこで優先順位を明示させて、

(a >= 0) == (b >= 0)

と書くべきでしょう。

論理演算子

 論理演算子もまたif文の条件によく使われる演算子です。論理演算子には、&&(論理AND)、||(論理OR)、!(論理否定)があります。

 例えば「aとbがともに70点以上で合格」という場合は、&&演算子を使い、

if (a >= 70 && b >= 70) {
        printf("合格です。\n");
}
else {
        printf("不合格です。\n");
}

と書けます。

 &&演算子は、左辺と右辺の値が0と比較して等しくない場合は1、それ以外の場合は0を結果の値とします。&&演算子は先に左辺を調べて、もし左辺値が0ならば右辺の計算はしません。aが70点に満たなければ、残念ながらその時点で不合格が確定してしまいます。

 ||演算子は、左辺と右辺の値が0と比較してどちらか一方でも等しくない場合は1、それ以外の場合は0を結果の値とします。||演算子は先に左辺を調べて、もし左辺値が0でなければ右辺の計算をしないことは&&演算子と同じです。

 !演算子は単項演算子で、右辺の値が0と比較して等しくない場合は1、それ以外の場合は0を結果の値とします。

 以上のようにC言語では真(true)を1、偽(false)を0としていますが、一方で論理演算の働きはif文が基になっているようで、非0を真(true)、0を偽(false)と扱っています。

if文のコーディングにご注意

 ここで、if文に関係するC言語ならではのエラーに触れてみましょう。次のプログラムは、nに0が入力された場合に「ゼロです。」と表示するものです。


#include <stdio.h>
int main(void){
        int n;
        printf("数値を入力してください->");
        scanf("%d", &n);
        if (n == 0) printf("ゼロです。\n");
        return 0;
}
 
プログラム2 「zero.c」

 ここで誤ってif文のかっこの中の==を=と書いても、Cコンパイラは正常にコンパイルします。

if (n = 0) printf("ゼロです。\n");

 しかしこのプログラムを実行してみると、0を入力しても「ゼロです。」とは表示されなくなります。if文はまずかっこの中の式を実行するため、この場合はまずnに0を代入します。すると式の値は常に0になってしまうので、if文の条件は常に偽(false)なのです。

 では次の場合はどうでしょう。今度は誤ってかっこの後ろにセミコロン(;)を書いてしまいました。

if (n == 0);
        printf("ゼロです。\n");

 するとnの値にかかわらず常に「ゼロです。」と表示されてしまいます。

 Cコンパイラは誤って付けたセミコロン(;)を空文と解釈します。ですからこのif文は、nが0のとき何もしないことになります。printfはif文とは無関係になって常に実行されてしまいます。

宿題5:月から季節を判定

 それでは、次回の宿題です。

宿題5:

何月かを入力し、表のようにその季節を表示するプログラムを作成してください。

季節
3、4、5
6、7、8
9、10、11
12、1、2

⇒解答と解説は次回



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.