前回までのサンプルで確認したように、C言語のプログラムは基本的に上から書いた順に関数が実行されていく形で動作します。
一連の作業を順に行うだけならこれで構わないのですが、プログラムによっては状況に応じて処理を分岐したい場合も出てきます。
このような場合は、if文による処理分岐を行います。
というわけで、今回のサンプルはこちらです。
点数を入力し、60点以上なら合格、60点未満なら不合格と表示するプログラムです。
#include <stdio.h> int main() { int score; printf( "点数を入力してください>" ); scanf( "%d", &score ); if ( score >= 60 ) { printf( "合格です\n" ); } else { printf( "不合格です\n" ); } } |
実行すると、以下のような結果になります。
入力した値に応じて表示されるメッセージが変わっています。
$ gcc -o iftest.exe iftest.c $ ./iftest.exe 点数を入力してください>60 合格です $ ./iftest.exe 点数を入力してください>50 不合格です $ ./iftest.exe 点数を入力してください>63 合格です |
if文の構文
if文は以下の構成をとります。if ( 条件式 ) { 条件が成立した場合の処理 } else { 条件が成立しない場合の処理 } |
条件が成立しない場合の処理がない場合は、elseの部分は省略する事も可能です。
if ( 条件式 ) { 条件が成立した場合の処理 } |
さらに条件が成立した場合の処理が1命令しかない場合は、括弧も省略する事も出来ます。
if ( 条件式 ) 条件が成立した場合の処理 |
プログラム的には問題なく動作する書き方ですが、この記法は人が見たときに分かり辛くなる為、1命令しかない場合でも括弧を書くほうが望ましいです。
例えば、以下のプログラムは期待したように動きますが…
/* 100点のときに満点と表示する */ if ( score == 100 ) printf( "満点です\n" ); |
これはNGです。
if ( score == 100 ) printf( "満点です\n" ); printf( "おめでとうございます\n" ); |
括弧が無いときにifが掛かる処理は1文だけなので、上記のコードは以下の処理と等価です。
if ( score == 100 ) { printf( "満点です\n" ); } printf( "おめでとうございます\n" ); |
これでは、100点以外の人にも”おめでとうございます”のメッセージが表示されてしまいます。
elseの後には、さらにifを連ねる事も可能です
if ( score > 60 ) { printf( "残念です\n" ); } else if ( score > 80 ) { printf( "良く出来ました\n" ); } else { printf( "たいへん良く出来ました\n" ); } |
前述した”if内の命令が1文のときは括弧を省略できる”というルールはelse側にも適用されるので、上記コードは実際には以下の処理となります。
/* else側で省略された括弧を明示する */ if ( score > 60 ) { printf( "残念です\n" ); } else { if ( score > 80 ) { printf( "良く出来ました\n" ); } else { printf( "たいへん良く出来ました\n" ); } } |
上記2つは、どちらの書き方でも同じ振る舞いになりますが、多分岐である事を明示したい場合は、前者の記法をすることが多いです。
条件式として指定する値
前述のif文には条件式として不等号による判断式でした。C言語で判断式を書いた場合その式の評価結果は、以下の値を取ります。
条件が成立しない場合 : 0と評価される 条件が成立する場合 : 0以外と評価される |
こんな事を急に書くと訳が分からなくなりそうなので、一旦確認用のプログラムを作成してみます。
#include <stdio.h> int main() { int score; int result; printf( "点数を入力してください>" ); scanf( "%d", &score ); result = ( score > 60 ); /* 条件式の判断結果を変数に代入する */ printf( "resultの値は%dです\n", result ); } |
実行結果は以下のようになりました。
$ gcc -o iftest iftest.c $ ./iftest 点数を入力してください>50 resultの値は0です $ ./iftest 点数を入力してください>62 resultの値は1です $ ./iftest 点数を入力してください>100 resultの値は1です |
というわけで確かに、条件が成立しない場合は0、成立する場合は0以外(上記例では1)がセットされました。
ここで、”0以外と評価される”ですがこれはC言語の規格上の定義(ANSI C)になります。
実際のところは大抵のコンパイラで1がセットされる事が多いのですが、1が返される事を期待したプログラムを作成するのはNGです。
コンパイラによっては、2を返したとしてもC言語の規格にはマッチしているので、移植性の悪いプログラムになってしまいます。
…というわけで、条件式の評価結果を確認してみました。
で、今回の話題であるif文ですが、これも上記のルールを踏襲しており、真偽値を、”0の時は偽/0以外の時は真”とみなします。
なので、if文の条件判定は、以下の振る舞いとなります。
if ( 0 ) { /* この処理は走らない */ } else { /* この処理が実行される */ } if ( 1 ) { /* この処理が実行される */ } else { /* この処理は走らない */ } if ( 2 ) { /* この処理が実行される */ } else { /* この処理は走らない */ } |
よく使われる条件式
C言語のifによる条件分岐では、関係演算子を使用することが多いです。
よく使用する関係演算子は以下の通りです
演算子 使用例 意味 == a == b aとbが等しいとき真 != a != b aとbが等しくないとき真 >= a >= b aがb以上のとき真 <= a <= b aがb以下のとき真 > a > b aがbより大きいとき真 < a < b aがbより小さいとき真 |
また、複数の条件を組み合わせる事もできます。
&& 論理積 || 論理和 ! 否定 |
組み合わせは、例えば以下のように記述できます。
if ( a % 3 == 0 || a % 5 == 0 ) { // 3の倍数か5の倍数の時に処理を行う } |
条件式の書き間違いに注意
条件比較で==とすべきところを間違って=にしてしまうのはよくあるミスです。
=にしてしまうと、代入を行った上で代入値が0かどうかの判定を行う事になり、期待した動作にならないので気をつけてください。
関連記事
コメントを残す