論理AND/OR演算子を使ったif文
論理ANDの演算子である && や、論理ORの演算子である¦¦をif文の制御式に使って、「AかつBの場合」とか、「AまたはB」の場合といった条件でif文を記述することができます。
&& を使ったif文
if文の制御式に && を使った例をリスト5.3に示します。この例では、i >= 10という条件とi < 20という条件が && の演算子で結ばれているため、結局、「変数iの値が10以上であり、かつ20未満だった場合」に真となります。elseの部分はその条件に当てはまらなかった場合、つまり、「変数iの値が10以上であり、かつ20未満だった場合」ではなかった場合に実行されます。
もし、 i >= 10 && i < 20 という書き方がわかりにくく感じる場合は、(i >= 10) && (i < 20) と( )を補って書いてもよいでしょう。ただし、 && 演算子は >= や < の演算子より優先順位が高いため、( )があってもなくても結果は同じになります。
また、数学では変数iの値が10以上20未満であることを 10 <= i < 20 のように書くため、これにならって i >= 10 の部分の右辺と左辺を入れ換え、 10 <= i && i < 20と書いてもよいでしょう。
¦¦ を使ったif文
今度は、if文の制御式に ¦¦ を使った例をリスト5.4に示します。この例では、 i < 10」という条件と 20 <= i という条件が ¦¦ の演算子で結ばれているため、if文の制御式が真になるのは、「変数iの値が10未満か、または20以上だった場合」となります。elseの部分はその条件に当てはまらなかった場合となるため、「変数iの値が10未満でも、20以上でもなかった場合」となります。
前述のif_and.c(リスト5.3)と、このif_or.cとは、if文の真偽が逆になっているだけです。つまり、ifのあとの文とelseのあとの文とが入れ替わっているだけで、結局同じことを処理するプログラムになっています。このことに注意しながらif_and.cとif_or.cを見くらべ、理解を深めてください。
if文で使えるのは == などの比較演算子だけではない
C言語では、if文が直接変数などの値を比較して条件判断するのではなく、あくまで制御式の値が真(0以外)か偽(0)かで条件判断を行ないます。前述のとおり、if文の制御式には通常 == などの比較演算子を含む式を使いますが、文法的には制御式としてどのような式を使っても構いません。結局、制御式の値が真(0以外)であればifのあとの文が、偽(0)であればelseのあとの文が実行されるのです。
極端な場合、演算子すら使わず、変数そのものを制御式として、
と書くこともできます。この場合、iの値がゼロ以外ならばifの条件が真になるため、
と書いたのと同じことになります。
== を = と書いてもエラーにならない
if文で、
と書くべきところを
と書いてしまうという誤りがときどき見られます。C言語のif文では、if(i = 3) と書いても文法的には正しく、コンパイル時にもエラーは発生しません。このため、プログラムのミスに気づきにくく、注意が必要です。
if(i = 3) と書くと、 =は比較演算子ではなく代入演算子であるため、変数i に3という値が代入されます。そして、代入演算子を使った演算の結果、式全体が3という値を持つため、これはif文としては if(3) として条件判断を行います。C言語では0以外の数はすべて真となるため、結果的にこのif文はiの値に関わらず常に真となってしまうのです。