次のような機能があるかどうか疑問に思っていました:
bool Foo::Bar()
{
return A() || B() || C();
}
A() が true を返す場合、Bar() はすぐに true を返しますか、それとも最終値を評価する前に B() と C() の結果を計算しますか?
が true の場合A()
、B も C も評価されません。これをオペレータ短絡と呼びます。
同様にA && B && C
、 if A
is falseなどのステートメントでは、 B も C も評価されません。
これは単なる最適化ではありません。B
またはC
に依存する場合に特に便利ですA
。たとえば、ポインターが何かを指していることをテストし、指しているオブジェクトのメソッドを 1 つのステートメントで呼び出すことができます。
if (my_pointer && my_pointer->some_method() > 9) {
}
はい、orを呼び出さずBar
にすぐに を返します。これは、 が短絡演算子であるためです。演算子のオペランドが を返す場合も同様です。チェーンは、評価の結果が判明するとすぐに停止します。これは、次のように、式の最初の部分が 2 番目の部分を潜在的なエラーから保護している場合に不可欠です。true
B
C
||
&&
false
return (ptr == NULL) || ptr -> failed();
式の最初の部分が であることを発見した後で評価が停止しなかった場合、true
ポインターNULL
は 2 番目の部分で逆参照され、未定義の動作が発生します。
A() が true を返す場合、Bar() はすぐに true を返しますか、それとも最終値を評価する前に B() と C() の結果を計算しますか?
いいえ!!A()
returnの場合はまったく実行されませんtrue
。
演算子のいずれかのオペランドが true を返した瞬間||
、それ以上のオペランドは評価されないため、完全な式の結果は既にわかっています。