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 
図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の値に関わらず常に真となってしまうのです。

おすすめ記事

記事・ニュース一覧