31

論理演算子 ( ) の左から右への評価は&& ||保証されていますか?

私がこれを持っているとしましょう:

SDL_Event event;

if (SDL_PollEvent(&event)) {
    if (event.type == SDL_QUIT) {
            // do stuff
    }
}

これはこれと同じであることが保証されていますか?

SDL_Event event;

if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
    // do stuff
}

aこれも非常に重要な場合があります。2 つの要件があるとしましょうb。要件aは失敗する可能性がはるかに高くなりbます。if (a && b)と言うよりも効率的ですif (b && a)

4

1 に答える 1

48

はい、保証されています。そうしないと、そのような演算子はその有用性の多くを失うことになります。

重要な注意: これは組み込みのandに対してのみ有効です。一部の犯罪者がそれらをオーバーロードした場合、それらは「通常の」オーバーロードされた二項演算子として扱われるため、この場合、両方のオペランドが常に評価され、通常どおり不特定の順序で評価されます。このため、それらを過負荷にしないでください。プログラムの制御フローに関する非常に重要な前提が崩れます。&&||


関連する標準見積

組み込み&&で、||短絡動作が保証されています

§5.14 ¶1

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

§5.15 ¶1

とは異なり|||左から右への評価が保証されます。さらに、最初のオペランドが に評価される場合、2 番目のオペランドは評価されませんtrue

オーバーロードされた場合、それらは「通常の」二項演算子として動作します (評価の短絡または保証された順序はありません)。

§13.5 ¶9

13.5.3 節から 13.5.7 節で明示的に言及されていない演算子は、13.5.1 または 13.5.2 の規則に従う通常の単項および二項演算子として機能します。

およびは&&||これらの節で明示的に言及されていないため、通常の §13.5.2 が保持されます。

§13.5.2 ¶1

二項演算子は、1 つのパラメーターを持つ非静的メンバー関数 (9.3) または 2 つのパラメーターを持つ非メンバー関数によって実装されます。したがって、任意の二項演算子@について、はまたはx@yとして解釈できます。x.operator@(y)operator@(x,y)

片側だけを評価したり、特定の順序で評価したりするための特別な規定はありません。

(すべて C++11 標準からの引用)

于 2011-04-15T22:40:02.523 に答える