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」は本来インデント(字下げ)をすべきではないが、 計算機にとってはインデントの有無は関係ない。)
以上のように処理範囲が曖昧となることを避けるため、 単文の場合にも { } をつけてブロック化する習慣をつけることが望ましい。