ブロック化の省略と処理の流れ

if-else 文、while 文、do-while 文、for 文において、 「処理」がただ一つの文(単文)で記述される場合、ブロックを表す { } は省略することができる。 (以下、if-else 文を例にとる。)

if (a > b) {
    max = a;    /* 単文 */
} else {
    max = b;    /* 単文 */
}

  ↓

if (a > b)
    max = a;    /* { } を省略 */
else
    max = b;    /* { } を省略 */

ただし、{ } を省略したために処理範囲が曖昧となるという側面もある。 例えば次の2つの擬似コードを考えてみよう。(else がない例である。)

(A)(B)
if (条件) {
    文1
    文2
}
if (条件)
    文1
    文2

(A)と(B)には表面上は { } があるかないかの違いしかないが、処理の流れは大きく異なることに注意が必要である。

(A)では「条件」が真のとき「文1」「文2」を実行し、偽のときは何も処理を行わない。 一方(B)では「条件」が真のときは(A)と同様(「文1」「文2」を実行)であるが、偽のときは「文2」を実行する。

なぜなら、(B)の場合、if 文の「条件が真の場合の処理」は「文1」だけであり、 文2は if 文の次の文(連続構造)となっているからである。 したがって計算機は、if 文において何も処理をしなかった後、文2の処理に移る。 ((B)の「文2」は本来インデント(字下げ)をすべきではないが、 計算機にとってはインデントの有無は関係ない。)

以上のように処理範囲が曖昧となることを避けるため、 単文の場合にも { } をつけてブロック化する習慣をつけることが望ましい