if文のネスティング
if文の中に別のif文を入れ、さらに複雑な条件判断を行うこともできます。if文や後述のfor文while文などの中に、別のif文、for文、while文などを入れることをネスティング(入れ子)と言います。ネスティングの際にはインデント(字下げ)を行い、プログラムの構造が視覚的にわかりやすいようにするとよいでしょう。
ネスティング時のelseの注意
複数のif文がネスティングしている場合、elseの使用には注意が必要です。elseは文法上、直前のifにかかることになっているため、場合によってはelseが意図しないifと結び付いてしまうことがあります。
たとえば、リスト5.6のelseは、最初のif(A)に対応するものとして書いたつもりです。
しかしこのelseは、リスト5.7のように、if(B)に対するelseと解釈され、結果的にプログラムの動作は意図したとおりにはなりません。
この問題の原因は、if(A)の直後の{ }を省略してif(B)を続けてしまったことにあります。正しくはリスト5.8のように{ }を省略しないで書くことです。このように記述すれば、elseはif(A)に対するelseと解釈されるようになります。
else if による複数の場合分け
たとえば、変数iの値が1だった場合、2だった場合、3だった場合…でそれぞれ別の処理をしたい場合は、リスト5.9のように else if を使って必要なだけそれぞれの条件を記述します。最後のelseのあとは、変数iの値が1でも2でも3でもない場合、となります。
なお、C言語の文法上に「else if」という制御文があるわけではありません。「else if」と記述すると、文法上はあくまでelseに続いて別のif文がネスティングされているものと解釈されます。したがって、前述のelse_if.c(リスト5.9)をネスティングどおりにインデントすると、リスト5.10のようになります。
しかし、これでは繁雑でわかりにくいため、elseのあとにif文が1つのみ続く場合はリスト5.9(else_if.c)のように「else if」と記述するのです。この場合、elseのあとの{ }は省略していることになります。これは、{ }を省略した方がよいという例外のひとつと言えます。