短絡評価
読み:たんらくひょうか
外語:Short-Circuit Evaluation

 プログラミング言語の論理演算子において、左辺値(第一項)と右辺値(第二項)の評価方法の一つ。
目次

概要
 プログラミング言語の論理演算子は一般に、「〓左辺値〓 〓論理演算子〓 〓右辺値〓」の順で記述して使われる。この時、左辺値(第一項)を評価した時点で式全体の値が定まる場合、右辺値(第二項)を評価することは時間の無駄になるため評価を省く、という評価方針である。
 例えば、論理積(論理AND)演算子であれば左辺値がfalseであれば右辺値がどうあれ式全体は必ずfalseであり、論理和(OR)演算子であれば左辺値がtrueであれば右辺値がどうあれ式全体は必ずtrueである。こういった場合、言語仕様または処理系依存のいずれかで、右辺値(第二項)は評価せずに動作する。

特徴

言語の差
 Cの場合、K&Rの時代から短絡評価と決まっており、ISO/IEC標準化以降も同様である。短絡評価しないための演算子は存在しない。
 C++も同様だが、ユーザー定義型に対して&&および||演算子をオーバーロードした場合は短絡評価ではなくなる。
 Javaの場合、短絡評価の論理演算子と非短絡評価の論理演算子が別れている。&& (and) や || (or) の動作はCと同様に短絡評価するが、一方で & (and) と | (or) については短絡評価をしない。
 JavaScriptの場合、&& (and) や || (or) および ?? (null合体演算子)などはfalsyな値が見つかった時点で後のものを評価しない、短絡評価となり、返す型は最後に評価した値に依存する。
 Lisp、Perl、PythonなどもJavaScriptと同様で常に短絡評価となり、返す型は最後に評価した値に依存する。
 Visual Basicの場合、And, Or演算子は短絡評価をしない。Visual Basic .NETも同様だが、新たに短絡評価する演算子AndAlso, OrElseが追加された。

具体的な例
 短絡評価されて右辺値が評価されないとはどういうことかを、以下にCで例示する。

int a = 0; if (a && anyfunc(b) { doing_something(); }

 この場合、まずanyfunc(b)自体が呼び出されることがない。a が 0 であり、この時点でfalseと評価が確定するためである。
 これはnullかどうかの評価でよく活用されている。

if ((p != NULL) && (strlen(p) >= 5)) { doing_something(); }

 左辺値の時点でNULLの場合falseとなり短絡評価されるため、次のstrlenの引数pがNULLつまりヌルポインターの条件で関数が呼び出されることは決してなく、安全に動作するプログラムとすることができる。これは次のように書いても同様に動作するが、このような無駄な書き方をせずに済み、プログラムの書きやすさを向上させる結果となっている。

if (p != NULL) { if (strlen(p) >= 5) { doing_something(); } }


再検索