短絡評価(ショートサーキット評価)とは
短絡評価(short-circuit evaluation)とは、多くの
プログラミング言語における
論理演算子の評価方法の一つで、
最小評価とも呼ばれます。この評価方法では、
論理演算子の左辺(第一引数)を評価した結果によって、右辺(第二引数)の評価を省略するかどうかを決定します。これにより、プログラムの実行効率を向上させたり、エラーを回避したりすることが可能になります。
短絡評価の仕組み
論理演算子を用いた式 `A 演算子 B` があるとき、短絡評価では以下の様に動作します。
論理積(AND)の場合: 左辺 `A` が `false` と評価された場合、式全体の結果は必ず `false` となるため、右辺 `B` は評価されません。
論理和(OR)の場合: 左辺 `A` が `true` と評価された場合、式全体の結果は必ず `true` となるため、右辺 `B` は評価されません。
このように、左辺の評価だけで式全体の結果が確定する場合は、右辺の評価を省略することで、プログラムの実行時間を短縮できます。
多くの
プログラミング言語で短絡評価が採用されていますが、一部の言語や状況では異なる動作をします。
C/C++: 組み込み型に対する論理演算子は短絡評価されます。ただし、ユーザー定義型で `&&` や `||` をオーバーロードした場合は、短絡評価は保証されません。
Java: 短絡評価を行う `&&` や `||` の他に、
ビット演算子としても使用される `&` や `|` も
ブーリアン型に対してオーバーロードされており、これらは短絡評価を行いません。
C#: 条件論理演算子はオーバーロードできませんが、ユーザー定義型で特定の演算子をオーバーロードすることで、短絡評価のような挙動を実現できます。
Visual Basic .NET: 短絡評価をサポートしています(以前のバージョンではサポートされていませんでした)。
ALGOL 68: `proceduring` という機能により、ユーザーが短絡評価の演算子を定義できました。
短絡評価の利点と注意点
利点
1. 効率的な処理: 不要な処理の実行を避け、実行時間を短縮できます。
2. エラー回避: 右辺が実行時エラーを引き起こす可能性がある場合、左辺の条件によって実行を抑制できます(例:ヌルポインタ参照の回避)。
3. コードの簡潔化: `if` 文の入れ子を減らし、より読みやすいコードにすることができます。
注意点
1. 副作用: 右辺に副作用のある式が含まれる場合、短絡評価によってその式が実行されない可能性があります。そのため、副作用を期待したコードは動作が変わる可能性があります。この問題を避けるためには、式の評価順序を調整したり、一度変数に格納してから論理演算を行うなどの対策が必要です。
短絡評価の例
以下は C言語での短絡評価の例です。
c
int a = 0;
int myfunc(int b) {
printf("myfunc called
");
return b;
}
if (a && myfunc(10)) { // aがfalseなのでmyfuncは呼ばれない
printf("true
");
}
int ptr = NULL;
if (ptr != NULL &&
ptr == 10) { // ptrがNULLの場合、ptrは評価されないのでエラーにならない
printf("ptr is 10
");
}
短絡評価の応用
短絡評価は、条件付きのコード実行に役立ちます。例えば、以下の
Perlの例では、`open` が失敗した場合にのみ die を実行します。
perl
open(my $fh, "<", "filename") or die "Could not open file";
まとめ
短絡評価は、効率的で安全なプログラミングに不可欠な概念です。適切に活用することで、プログラムのパフォーマンスを向上させ、エラーを未然に防ぐことができます。しかし、副作用のある式を用いる場合は、短絡評価の動作に注意する必要があります。