0

次のような機能があるかどうか疑問に思っていました:

bool Foo::Bar()
{
     return A() || B() || C();
}

A() が true を返す場合、Bar() はすぐに true を返しますか、それとも最終値を評価する前に B() と C() の結果を計算しますか?

4

3 に答える 3

8

が true の場合A()、B も C も評価されません。これをオペレータ短絡と呼びます。

同様にA && B && C、 if Ais falseなどのステートメントでは、 B も C も評価されません。

これは単なる最適化ではありません。BまたはCに依存する場合に特に便利ですA。たとえば、ポインターが何かを指していることをテストし、指しているオブジェクトのメソッドを 1 つのステートメントで呼び出すことができます。

if (my_pointer && my_pointer->some_method() > 9) {

}
于 2012-12-21T13:48:44.043 に答える
2

はい、orを呼び出さずBarにすぐに を返します。これは、 が短絡演算子であるためです。演算子のオペランドが を返す場合も同様です。チェーンは、評価の結果が判明するとすぐに停止します。これは、次のように、式の最初の部分が 2 番目の部分を潜在的なエラーから保護している場合に不可欠です。trueBC||&&false

return (ptr == NULL) || ptr -> failed();

式の最初の部分が であることを発見した後で評価が停止しなかった場合、trueポインターNULLは 2 番目の部分で逆参照され、未定義の動作が発生します。

于 2012-12-21T13:48:48.667 に答える
1

A() が true を返す場合、Bar() はすぐに true を返しますか、それとも最終値を評価する前に B() と C() の結果を計算しますか?

いいえ!!A()returnの場合はまったく実行されませんtrue

演算子のいずれかのオペランドが true を返した瞬間||、それ以上のオペランドは評価されないため、完全な式の結果は既にわかっています。

于 2012-12-21T13:49:48.483 に答える