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