Cプログラミング入門

第14回 Chapter5 if文で条件分岐(2)

この記事を読むのに必要な時間:およそ 1.5 分

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

著者プロフィール

山森丈範(やまもりたけのり)

「C言語はアセンブラを触っているうちに自然に覚えてしまった」というプログラマ。C言語とのかかわり上,OSは専らUNIXを使用。C言語のプログラムでは,いつもLinux/FreeBSD/Solarisすべてで動くことを気に留めている。C言語と同様に移植性の高いシェルスクリプトにも思い入れが深く,著書に『シェルスクリプト基本リファレンス』がある。

著書

コメント

コメントの記入