if文 (選択文) | C言語

if文は条件分岐を可能にする、最も基本となる制御文の1つです。もし条件式Xを満たす(真)ならYを実行するという使い方で、下記はそのもっとも単純な例です。

[基本形]

if (条件式) {
  ...
}

[例]

if (x == 0) {
  // xが0ならyを0にする
  y = 0;
}
目次

関係演算子

if文が条件式を満たすかどうかを判定するものとして、下記表の関係演算子があります。

スクロールできます
演算子記述例内容
==a == baとbが等しいとき真(等価)。
!=a != baとbが等しくないとき真。
a > baがbより大きいとき真(超過)。
>=a >= baがb以上のとき真。
a < baがb未満のとき真。
<=a <= baがb以下のとき真。

条件式を満たす条件

if文の条件式には、正しくは上の表の関係演算子を用いる必要はありません。if文が条件式を満たすのは、条件式の結果が真のときです。そして条件式の結果が真とは、「0ではない」状態を表します。これを例で示すと、下記のようになります。

if (1) {
  // 必ず実行される
}

if (0) {
  // 絶対に実行されない
}

論理演算子

if文の条件式には、複数の条件を設定することができます。

スクロールできます
演算子記述例内容
&&A && B論理積(AND)。条件式AとBが共に真のときに真。
||A || B論理和(OR)。条件式AまたはBが真のときに真。
!!A否定(NOT)。条件式Aを満たさないときに真。
if ((a == 0) && (b == 0)) {
  // "a = 0"かつ"b = 0"なら実行する
}

if ((a == 0) || (b == 0)) {
  // "a = 0"または"b = 0"なら実行する
}

if (!(a == 0)) {
  // aが0でなければ実行する
}
  • 「&&」と「||」を含む3つ以上の論理演算子を組み合わせる場合、( )を設けて優先順位を明確にしてください。
// "a = 0 かつ b = 0" または "c = 0" なら真
if (((a == 0) && (b == 0)) || (c == 0))

// "a = 0" かつ "b = 0 または c = 0"なら真
if ((a == 0) && ((b == 0) || (c == 0)))
  • 条件式は左のものから順に実行されます。そして途中で真偽が確定した場合、それ以降の判定は打ち切って実行されません。これを短絡評価(ショートサーキット)といいます。
// "a = 0"なら++bは実行されない
if ((a == 0) || (++b == 5)) {
  ...
}

複数の分岐(if-else文)

if文を用いることで、複数の分岐を発生させることができます。それがif-else文で、下記のように2分岐や3分岐以上の枝分かれが可能です。

if (a == 0) {
  // aが0なら実行する
} else {
  // aが0でなければ実行する
}

if (a == 0) {
  // aが0なら実行する
} else if (a == 1) {
  // aが1なら実行する
} else {
  // aが0でも1でもなければ実行する
}

「==」と「=」の誤り

if文での等価演算子は「==」です。これを「=」にしてしまうという誤りが、C言語ではよくあります。なぜなら下記のように記述しても、コンパイラーはエラーを出さないからです。

if (a = b) {
  // bが0でなければ実行される
}

if文かswitch文か

C言語にはif文以外にswitch文というものがあります。どちらを使うかは好みの問題で決めて構いませんが、迷うようであれば下記にしたがうといいでしょう。

  1. 分岐が2つならif文を使う。
  2. 分岐が4つ以上ならswitch文を使う。
  3. 今後の状況しだいでさらに分岐が増えていくなら、if文とポインターを使う。
目次