条件分岐
分岐は、条件によって処理の流れを振り分ける命令です。C言語では以下のように書きます。
if ( 条件文 ){ 実行文; }
英単語どおり、「もし(if)、条件文が成立したら、実行文を実行する」という動作をします。条件文は、本連載の記事「シフト演算」に登場した「比較演算子」を使って記述します。もういちど記載しますので思い出してください。
<、<= | 大小比較 |
== | 等しいかどうか |
!= | 等しくないかどうか |
x < y | xがyよりも小さい(yがxより大きい)とき、この条件が成立します。 |
x <= y | xがyよりも小さい(yがxより大きい)か、等しいとき、この条件が成立します。 |
x == y | xとyが等しいとき、この条件が成立します。 |
x != y | xとyが等しくないとき、この条件が成立します。 |
もし~
たとえば、「もし、ある変数Varが10より小さかったら、変数Varに1を加える」という場合は以下のように書きます。
if ( Var < 10 ) { Var = Var + 1; }
この場合、Var < 10
が条件文で、Var = Var + 1;
が実行文です。
では今度は、上記に加えて「Varが10以上だったら、Varを0にする」という処理をさせたいときはどうすればよいでしょうか。以下のように書きます。
if ( Var < 10 ) { Var = Var + 1; } if ( 10 <= Var ) { Var = 0; }
さもなければ
実はif文には、else
という便利な命令があります。elseは英語で「さもなければ」という意味です。elseは以下のように使います。
if ( 条件文 ){ 実行文1; } else{ 実行文2; }
「もし(if)、条件文1が成立したら、実行文1を実行し、さもなければ(else)、条件文2を実行する」と、動作します。elseを使って前記の2つのif文を書き直すと、以下のようになります。
if ( Var < 10 ) { Var = Var + 1; } else { Var = 0; }
if文を2つ連ねて書くよりもすっきりしてわかりやすいですね。
さもなく、もし
if文は、さらに凝った書き方もできるようになっています。たとえば、
- もしVarが10より小さかったらVarに1を加える
- さもなく、もしVarが20よりも小さかったらVarに2を加える
- さもなければ、Varを0にする
という処理をさせたい場合を考えます。真ん中の、「さもなく、もし」が新しい表現ですね。これはこのままC言語の命令に置き換えればelse if
です。はい、そのとおり書けばOKです。
if ( Var < 10 ) { Var = Var + 1; } else if ( Var < 20 ){ ← Varが10以上で20未満のときこの条件が成立します Var = Var + 2; } else { Var = 0; }
if文では、実行文を中カッコ{}
で囲むことに注意してください。文法上は、実行文が1行だけなら{}
は不要です。たとえば上記例では、以下のように書いても正しく動作します。
if ( Var < 10 ) Var = Var + 1; else if ( Var < 20 ) Var = Var + 2; else Var = 0;
しかし、後から実行文を追加したいときには、どうしたらよいでしょうか。ここでは「最後のelseのとき(Varが20以上の場合)、別の変数Tempを1にしたい」を、以下のように追加したとしましょう。
if ( Var < 10 ) Var = Var + 1; else if ( Var < 20 ) Var = Var + 2; else Var = 0; Temp = 1;
試してみるとわかりますが、これは文法上正しいのでビルドでエラーになりません。しかし、elseにおける実行文は1行だけなので、Temp=1;は、if文とは関係ない実行文として解釈されてしまいます。
つまり、条件に関係なく、Temp=1;が実行されるわけです。ビルドでエラーが出ないので、つい見落としがちなミスです。こういうことを防ぐためにも、実行文が1行だけのときも必ず中カッコ{}をつけるクセをつけておくほうがよいです。
中カッコの付け方は
if ( 条件 ){ 実行文; }
または
if ( 条件 ) { 実行文; }
の2つの流儀が多数派です。どちらでもOKですが、プログラムの中ではどちらかに統一しておくのがプログラムを見やすくするコツです。