Cプログラミング入門
第14回 Chapter5 if文で条件分岐(2)
論理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未満だった場合」ではなかった場合に実行されます。
リスト5.3 if_and.c
#include <stdio.h>
int
main()
{
int i;
i = 15;
/* i = 6; */
if (i >= 10 && i < 20) {
/* iが10以上20未満だった場合の処理 */
printf("10 <= i < 20\n");
} else {
/* iが10以上20未満ではなかった場合の処理 */
printf("i < 10 or 20 <= i\n");
}
return 0;
}
図5.1 if_and.c(リスト5.3)のコンパイル/実行例
$ gcc -O2 -o if_and if_and.c $ ./if_and 10 <= i < 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を見くらべ,理解を深めてください。
リスト5.4 if_or.c
#include <stdio.h>
int
main()
{
int i;
i = 15;
/* i = 6; */
if (i < 10 || 20 <= i) {
/* iが10未満または20以上だった場合の処理 */
printf("i < 10 or 20 <= i\n");
} else {
/* iが「10未満または20以上」ではなかった場合の処理 */
printf("10 <= i < 20\n");
}
return 0;
}
図5.2 if_or.c(リスト5.4)のコンパイル/実行例
$ gcc -O2 -o if_or if_or.c $ ./if_or 10 <= i < 20 $
if文で使えるのは == などの比較演算子だけではない
C言語では,if文が直接変数などの値を比較して条件判断するのではなく,あくまで制御式の値が真(0以外)か偽(0)かで条件判断を行ないます。前述のとおり,if文の制御式には通常 == などの比較演算子を含む式を使いますが,文法的には制御式としてどのような式を使っても構いません。結局,制御式の値が真(0以外)であればifのあとの文が,偽(0)であればelseのあとの文が実行されるのです。
極端な場合,演算子すら使わず,変数そのものを制御式として,
if (i)
と書くこともできます。この場合,iの値がゼロ以外ならばifの条件が真になるため,
if (i != 0)
と書いたのと同じことになります。
== を = と書いてもエラーにならない
if文で,
if (i == 3)
と書くべきところを
if (i = 3)
と書いてしまうという誤りがときどき見られます。C言語のif文では,if(i = 3) と書いても文法的には正しく,コンパイル時にもエラーは発生しません。このため,プログラムのミスに気づきにくく,注意が必要です。
if(i = 3) と書くと, =は比較演算子ではなく代入演算子であるため,変数i に3という値が代入されます。そして,代入演算子を使った演算の結果,式全体が3という値を持つため,これはif文としては if(3) として条件判断を行います。C言語では0以外の数はすべて真となるため,結果的にこのif文はiの値に関わらず常に真となってしまうのです。

