C言語ホーム > if文前ページ次ページ
サイト内検索:

C言語のif文について

C言語のif文について説明しています。if文の構文だけでなく、条件演算子、プリプロッセッサのifについても説明しています。

if文

C言語において、条件によって処理を変えたい時はif文を使用します。


if (条件式) 文;

上記で、条件式が真ならば文が実行され、偽ならば実行されません。

実行したい文が複数ある場合は、{}で括ります。


if (条件式) {
	文;
	文;
	 :
}


条件式が偽である場合の実行文を指定したい場合は、elseを使います。


if (条件式) 文;
else 文;

/* 実行文が複数の場合 */
if (条件式) {
	文;
	文;
	 :
} else {
	文;
	文;
	 :
}

条件式が複数ある場合は、else ifを使います。elseとifの間には空白文字が入ります。


if (条件式1) {
	文;
	文;
	 :
} else if (条件式2) {
	文;
	文;
	 :
} else if (条件式3) {
	文;
	文;
	 :
} else {
	文;
	文;
	 :
}

if文をネストする(入れ子にする)こともできます。


if (条件式) {
	if (条件式) {
		文;
	} else {
		文;
	}
} else {
	if (条件式) {
		文;
	} else {
		文;
	}
}

if文でのよくある間違い

C言語でのif文でよくある間違いとして、比較演算子の==と代入演算子の=を間違える、というものがあります。つまり、if (a == b)と書くべきところをif (a = b)と書いてしまう、という不具合です。if (a = b)の場合、bをaに代入し、aを評価する、ということになります。ですので、bが0であれば偽、1であれば真となり、if (a == b)と違った結果になってしまいます。

この不具合の場合、コンパイルエラーも出ませんし、見た目での区別もつきにくいため、原因の特定が遅れることがあります。

回避策として「if文で定数を使う場合、定数を左側に書く」という方法もあります。if (a == 0)をif (0 == a)と書く方法です。こうしておけば、定数への代入はできませんので、コンパイルエラーとなり不具合の発見が早まります。欠点としては定数以外の比較では使えないということと可読性に劣るということが挙げられます。可読性に劣るというというのは、if (a == 0)は「もしaが0なら」と読めますがif (0 == a)は「もし0がaなら」と読めてしまうので、ちょっと解りづらいということです。

if関数

表計算ソフトで、よくif関数を使うことがあると思います。C言語初心者の方で「C言語にif関数はないのか?」と思う方もいらっしゃるようです。

C言語でif関数に相当するものに条件演算子(三項演算子)があります。


条件式 ? 式1 : 式2;

条件式が真ならば、式1が返され、偽ならば式2が返されます。具体例を見てみましょう。


cnt = (cnt < 100) ? cnt + 1 : 0;

この例ではcntが100未満なら1カウントアップされ、100以上ならcntが0にクリアされます。

プリプロセッサのif

C言語のif文ではないのですが、プリプロセッサ命令の#ifもよく使われます。条件によってプログラムの一部をコンパイル対象から外すことができます。

コンパイルを行う前に、ソースプログラムに対して行われる前処理をプリプロセスと呼び、このプリプロセスを行なうプログラムのことをプリプロセッサといいます。通常は、コンパイル時に自動でプリプロセッサが動きます。

#ifの構文は以下のとおりです。


#if 定数整数式
/* 定数整数式が真のとき、この部分がコンパイル対象になる */
/* 偽のときはコンパイル対象にならない */
#endif

定数整数式にはsizeof、型変換、enum定数を含むことはできません。

定数整数式が偽の場合にコンパイルする部分を指定する場合には#elseを、条件を追加するには#elif(elseifではない)を使います。


#if 定数整数式
/* 定数整数式が真のとき、この部分がコンパイル対象になる */
#else
/* 定数整数式が偽のとき、この部分がコンパイル対象になる */
#endif

/* elifの例 */
#if 定数整数式1
/* 定数整数式1が真のとき、この部分がコンパイル対象になる */
#elif 定数整数式2
/* 上記以外で、定数整数式2が真のとき、この部分がコンパイル対象になる */
#else
/* 定数整数式1、定数整数式2が共に偽のとき、この部分がコンパイル対象になる */
#endif

よく使われる使い方として、デバッグ時に#if 0と#endifでプログラムの一部をコンパイル対象外にする、という方法があります。/* */でコメントアウトするとコメントアウトしたいところにコメントがあるとコンパイルエラーになってしまいます(/* */の中に/* */は書けない)。#if 0と#endifでコンパイル対象外にしてしまえば、簡単に処理をなくすことができます。


#if 0

/* この部分はコンパイル対象外 */
/* コメント部分もそのままでOK */

#endif
C言語ホーム > if文前ページ次ページ
© 2009 C言語サイト管理人