第5回
制御構造と変数(1) if~条件判断と分岐の基本

比較演算子による条件設定

ifの条件式で変数の値を調べるには、2つの値を比較する比較演算子を用います。比較演算子による演算の結果は、正しいか正しくないかの2つに分かれます。

0以上かどうかを調べる

ここで作るプログラムでは、先に述べたように「ifの書式(2)」を使います。

条件式では
変数の値が0~9の整数かどうか
を調べなければなりませんが、ここではまず『0より大きいかどうか』だけを調べることにします。値の状態を調べるには、表1のような比較演算子を用います。これらは
x >= 100
のような形で用います。記号の左側の値を左辺(左辺値、左辺式)、右側の値を右辺(右辺値、右辺式)と呼び、左辺と右辺を比較した結果が正しければ(式が成立すれば)0以外の値を、正しくなければ(式が成立しなければ)0を返します。

比較演算子は右辺と左辺を比べてその結果を返しますが、このようにある式の結果を求めることを「(式を)評価する」と言います。

表1:比較演算子の種類と機能
演算子 機能
== 左辺と右辺が等しい
> 左辺が右辺より大きい
< 左辺が右辺より小さい(未満)
>= 左辺が右辺より大きいか等しい(以上)
<= 左辺が右辺より小さいか等しい(以下)
!= 左辺と右辺が等しくない

Cの論理値はint型

前回(第4回)で紹介した代入演算子は、演算子による演算の結果、様々な値を返しました。ここで紹介している比較演算子は、演算子の左辺と右辺を比較して正しければ0以外、正しくなければ0という2つの値のどちらかを返します。

条件式の結果が正しい場合を「真」、正しくない場合を「偽」と呼びます。真と偽の2種類しかないデータの形式を論理値と呼び、Visual BasicではTrue(真)とFalse(偽)の2つの値を持つBoolean型を使いますが、Cにはそのような便利な型はありません。そこで、Cではヘッダファイルに以下のような定義を記述して、論理型をint型で代用します。

#define BOOL int ---- BOOL型を定義(実体はint型)
#define FALSE 0 ----- FALSE(偽)は0
#define TRUE !0 ----- TRUE(真)は0以外
!は否定を意味する演算子で、“!0”は「0以外の値」を示します。

プログラムを作る

では、ソースコードを書き直して「ユーザーが0~9以外の値を入力したらメッセージを表示する」プログラムを作ってみましょう。リスト2のようになります。

if (num >= 0)
の箇所で変数numの値が0以上かを調べ、それが真のときには続く{ }内の計算結果を表示する処理が実行されます。

そして、そうではない(numが0未満の)場合にはelseに続く{ }内の処理が実行され、メッセージが表示されます。

ifによる条件の判定では
if (num >= 0)
と記述されています。先述したように、比較演算子(ここでは>=)を使った式は、その評価を0(偽)または0以外(真)の値で返します。つまり上の式を厳密に書くと
if ((num >= 0) != 0)
となり、『式“num >= 0”の評価が真(!= 0)であるかどうか?』を調べていることになります。もちろん、このような冗長な記述をする必要はありません。ifはそれに続く( )内の式を評価し、真だったときに続く処理を実行する構造となっているからです。

リスト2:入力された値が0以上でなければメッセージを表示するプログラム(標準的なCのソース)
#include <stdio.h>

int	main(void)
{
  int num;

  printf("Input number : ");
  scanf("%d", &num);

  if (num >= 0) { ------------ numの値が0以上のとき以下を実行
    printf("%d * 10 = %d\n", num, num * 10);
    return (0);
  } else { ------------------- そうでない場合には以下を実行
    printf("0~9までの数字を入力してください。\n");
    return (-1);
  }
}

returnと終了コード

リスト2では、returnによる処理の終了が2箇所記述されています。1つ目はnumが0以上だったとき、計算結果を表示した後に
return (0);
と記述され、2つ目はelse以降の{ }内でメッセージを表示した後に
return (-1);
と記述されています。

returnは関数ではなく、関数を抜け出すための命令語──キーワードです。main関数から抜け出すということは、プログラムの終了を意味します。このときreturnに続く( )内に記述した値が、このプログラムを呼び出した上位のプログラム(一般にはシェル・プログラム)に『終了コード』として返されます。

一般的には、プログラムが正常終了した(目的通りの処理を終えた)場合には0、エラーなどで目的の処理が達せられなかった場合には-1を返します。main関数はint型の値を返すように宣言されていますが、終了コードは1バイトの値としてシェルに処理されるため-1は16進数で\xFFとなり、符号なし10進数では255になります。

もちろん、終了コードは0と-1以外の値を返しても構いません。それによって、プログラム終了時の状態を上位であるシェル・プログラムに知らせることができます。