関係演算子は数としての大小を比較する演算子で、>(より大きい)、<(より小さい)、>=(以上)、<=(以下)の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文に関係する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文とは無関係になって常に実行されてしまいます。
それでは、次回の宿題です。
Copyright © ITmedia, Inc. All Rights Reserved.