短絡評価

読み:たんらくひょうか
外語: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();
    }
}
用語の所属
プログラミング言語

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club