是按位还是保证评估排序?

时间:2011-05-20 23:29:47

标签: c++ short-circuiting operator-precedence bitwise-or

说我有这段代码:

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

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

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

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

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

2 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:13)

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

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

相关问题