ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
プログラミング言語の論理演算子において、左辺値(第一項)と右辺値(第二項)の評価方法の一つ。
プログラミング言語の論理演算子は一般に、「«左辺値» «論理演算子» «右辺値»」の順で記述して使われる。この時、左辺値(第一項)を評価した時点で式全体の値が定まる場合、右辺値(第二項)を評価することは時間の無駄になるため評価を省く、という評価方針である。
例えば、論理積(論理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(); } }
コメントなどを投稿するフォームは、日本語対応時のみ表示されます