短絡評価とは

たんらくひょうか

論理演算の and(かつ)や or(または)で、左側の値だけで結果が決まるときに右側を評価しない評価の方法。and では左側が偽なら、or では左側が真なら、右側を評価しない。配列の範囲の確認を左側に書いて、範囲外の参照を防ぐのによく使う。

「短絡評価」は、2分野の3問の練習問題に出てきます(プログラミングの基礎(擬似言語のトレース), C言語の基礎など)。

この用語の分野: プログラミングの基礎(擬似言語のトレース)

結果が変わる場面

右側の式に関数の呼出しや配列の参照が含まれるとき、短絡評価かどうかで結果が変わります。「i ≦ n and a[i] ≠ x」は、i が n を超えると左側が偽になるので、範囲外の a[i] を参照しません。左右を入れ替えると、先に範囲外を参照してしまいます。右側で呼ぶ関数が変数を書き換える場合は、関数が呼ばれる回数も変わります。

プログラミング言語での扱い

C、Java、Python などの多くの言語では、論理演算の && と ||(Python では and と or)は短絡評価です。C や Java の & と | は、両側を必ず評価します。擬似言語の問題で短絡評価が結果に関わるときは、問題文の説明に従います。

条件の書き方の工夫

短絡評価を使うと、「配列の範囲内で、かつその要素が条件を満たす」のように、前の条件が成り立つときだけ意味を持つ条件を1つの式で書けます。時間のかかる判定を右側に置けば、左側で結果が決まったときに省けます。一方、必ず実行してほしい処理を右側の関数に入れると、呼ばれないことがあるので注意します。

よくある質問

短絡評価は最適化の一種ですか?

C、Java、Python などでは、短絡評価はコンパイラの最適化ではなく、言語の決まりとして定められています。そのため、右側が評価されないことを前提にしたプログラムを書いても、正しく動くことが保証されます。

not (A or B) と not A and not B は同じですか?

ド・モルガンの法則により、論理値としては同じです。not (i > n or a[i] = x) と i ≦ n and a[i] ≠ x は、どちらも i の条件だけで結果が決まるときに a[i] を評価しません。

解説の中の「短絡評価」

「短絡評価」が出てくる問題(3問)

  1. 次のプログラムの and は、左側の式が false のときは右側の式を評価しない(短絡評価)。cnt は大域変数である。実行した後の cnt の値はどれか。
  2. 要素数 n の配列 a から値 x を探し、見つかった要素番号を i に求める次のプログラムがある。配列の要素番号は1から始まる。and と or は、左側の式だけで結果が決まるときは右側の式を評価しない。【a】に入れる条件式のうち、x が a の中にないときに範囲外の a[n + 1] を参照してしまうものはどれか。
  3. && と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。

プログラミングの基礎(擬似言語のトレース)の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

変数 配列 オブジェクト指向 オフバイワンエラー 擬似言語 剰余演算 制御構造 整数除算 トレース表 引数

用語集の一覧へ