【問題4】Cコンパイラはif文をどう裁くのか:完全マスター! 組み込みC言語プログラミング(5)(2/2 ページ)
C言語を使ったマイコン制御プログラムの“イロハ”を解説する本連載。今回はif文を用いて、入力値が奇数であるか偶数であるかを表示するプログラムに挑戦します。
関係演算子と等価演算子
関係演算子は数としての大小を比較する演算子で、>(より大きい)、<(より小さい)、>=(以上)、<=(以下)の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; }
ここで誤って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:月から季節を判定
それでは、次回の宿題です。
Copyright © ITmedia, Inc. All Rights Reserved.