15

私がこのコードを持っているとしましょう:

unsigned int func1();
unsigned int func2();
unsigned int func3();

unsigned int x = func1() | func2() | func3();

C ++は、func1()が最初に呼び出され、次にfunc2()、次にfunc3()が呼び出されることを保証しますか?

または、コンパイラーは、関数を任意の順序で呼び出すことができますか?

また、コンパイラは、必要に応じて、ここで短絡最適化を実装できますか?(たとえば、func1()が〜0を返した場合、コンパイラーは、戻り値がxに割り当てられた値に影響を与えない可能性があることを知っているため、func2()またはfunc3()をわざわざ呼び出さないことを決定できますか?)

4

2 に答える 2

18

いいえ、関数が呼び出される順序は保証されません。とは異なり|||シーケンスポイントを意味するものではありません。

式内のすべての関数は、実装が副作用がないと判断でき、実際に関数の1つを呼び出さなくても式の結果を判断できる場合を除いて、呼び出す必要があります。実装は、「あたかも」ルールの下でこれを行うことができます。これにより、実装は、準拠プログラムでは監視または検出できない最適化を実行できます。

于 2011-05-20T23:34:04.897 に答える
13

短絡しません。順不同で実行される場合があります。

「評価の方向は、同じレベルに複数の乗算(*)、加算(+)、または2進ビット単位(&| ^)演算子を含む式の結果には影響しません。」

于 2011-05-20T23:33:05.147 に答える