プログラミングの基礎(擬似言語のトレース)
要素数 n の配列 a から値 x を探し、見つかった要素番号を i に求める次のプログラムがある。配列の要素番号は1から始まる。and と or は、左側の式だけで結果が決まるときは右側の式を評価しない。【a】に入れる条件式のうち、x が a の中にないときに範囲外の a[n + 1] を参照してしまうものはどれか。
整数型: i ← 1
while (【a】)
i ← i + 1
endwhile
- Aa[i] ≠ x and i ≦ n
- Bi ≦ n and a[i] ≠ x
- Cnot (i > n or a[i] = x)
答えと解説を見る
正解:A. a[i] ≠ x and i ≦ n
x が a の中にないと、i は n + 1 まで増えてから条件を判定します。i ≦ n and a[i] ≠ x では、左側の i ≦ n が false なので右側の a[i] は評価されず、範囲外を参照しません。not (i > n or a[i] = x) も、i > n が true の時点で or の結果が決まるので a[i] を評価しません。a[i] ≠ x and i ≦ n は、範囲を確かめる前に a[n + 1] を評価してしまいます。短絡評価に頼るときは、範囲の確認を左側に書きます。
- A. 正しい。i = n + 1 のとき、範囲を確かめる前に a[n + 1] を評価します。
- B. 左側の i ≦ n が false になると右側を評価しないので、範囲外を参照しません。
- C. i > n が true になった時点で or の結果が決まり、a[i] は評価されません。