15

说我有这个代码:

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

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

C++ 是否保证首先调用 func1(),然后是 func2(),然后是 func3()?

或者编译器是否允许以任何感觉的顺序调用函数?

另外,如果编译器愿意,是否允许在这里实现短路优化?(例如,如果 func1() 返回 ~0,编译器是否可以决定不打扰调用 func2() 或 func3(),因为它知道它们的返回值不可能影响分配给 x 的值?)

4

2 回答 2

18

不,不能保证函数将被调用的顺序。与 不同|||并不意味着序列点。

必须调用表达式中的所有函数,除非实现可以确定它们没有副作用并且无需实际调用函数之一就可以确定表达式的结果。实现可以在“好像”规则下执行此操作,该规则允许实现执行符合程序无法观察或检测到的任何优化。

于 2011-05-20T23:34:04.897 回答
13

它不会短路。它可能会乱序执行。

“评估的方向不会影响在同一级别包含多个乘法 (*)、加法 (+) 或二进制位 (& | ^) 运算符的表达式的结果。”

于 2011-05-20T23:33:05.147 回答