C ++「AND」評価-標準保証?

c++
C ++「AND」評価-標準保証?

_
可能な重複: + https://stackoverflow.com/questions/7580945/safety-concerns-about-short-circuit-evaluation [短絡評価に関する安全性の懸念]
_

標準では `&&`式の評価について何と言っていますか?パラメーターの評価が最初の `false`で停止することを保証していますか?

例えば。:

Foo* p;
//....
if ( p && p->f() )
{
    //do something
}

p == NULL`の場合、 f() `は呼び出されないことが保証されていますか?

また、評価の順序は、句の出現の順序であることが保証されていますか?

オプティマイザーは次のように変更する場合があります。

int x;
Foo* p;
//...
if ( p->doSomethingReallyExpensive() && x == 3 )
{
    //....
}

最初に `x == 3`を評価するフォームに? それとも本当に高価な機能を常に最初に実行しますか?

ほとんどのコンパイラ(おそらくすべて)で、最初の `false`に遭遇した後に評価が停止することを知っていますが、標準ではそれについて何と書かれていますか?

  0  0


ベストアンサー

_
標準では、&&式の評価について何と言っていますか?パラメーターの評価が最初のfalseで停止することを保証していますか?
_

Yes. それは短絡と呼ばれます。

_
また、評価の順序は、句の出現の順序であることが保証されていますか?
_

Yes. 左から右へ。 式が短絡する前のオペランドは評価されません。

int a = 0;
int b = 10;
if ( a != 0 && (b=100)) {}

cout << b << endl; //prints 10, not 100

実際、上記の2つのポイントは、ここでの私のソリューションのキーポイントです。

3


ANSI C標準3.3.13の場合:

Unlike the bitwise binary & operator, the && operator guarantees
left-to-right evaluation; there is a sequence point after the
evaluation of the first operand.  If the first operand compares equal
to 0, the second operand is not evaluated.

C ++標準には同等のステートメントがあります

3


&&(および ||)はシーケンスポイントを確立します。 そのため、左側の式は右側の前に評価されます。 また、はい、左側がfalse / trueの場合( && / `||`の場合)、右側は評価されません。

1


__
標準では、&&式の評価について何と言っていますか?パラメーターの評価が最初のfalseで停止することを保証していますか?

また、評価の順序は、句の出現の順序であることが保証されていますか?
__

5.14 / 1。 &とは異なり、&&は左から右への評価を保証します。第1オペランドがfalseの場合、第2オペランドは評価されません。

これは標準の&&演算子でのみ機能し、ユーザー定義の `operator &&`のオーバーロードにはこの保証はありません。通常の関数呼び出しのセマンティクスのように動作します。

_
オプティマイザーは、if(p→ doSomethingReallyExpensive()&& x == 3)のように、最初にx == 3を評価する形式に変更する可能性がありますか?
_

オプティマイザは、 x`が p→ doSomethingReallyExpensive() によって変更されない場合は副作用のない式であるため、最初に x == 3`を評価するか、または p→の後に評価することもできます。 doSomethingReallyExpensive() `はすでにfalseを返しました。 ただし、目に見える動作は、前に指定されたものであることが保証されています:左から右への評価と短絡。 つまり、 `x == 3`が最初に評価され、falseを返す場合でも、実装はまだ p→ doSomethingReallyExpensive() `を評価する必要があります。

0


タイトルとURLをコピーしました