说我有这段代码:
unsigned int func1();
unsigned int func2();
unsigned int func3();
unsigned int x = func1() | func2() | func3();
C ++是否保证首先调用func1(),然后调用func2(),然后调用func3()?
或者编译器是否允许以任何顺序调用函数?
此外,编译器是否允许在此处实现短路优化? (例如,如果func1()返回〜0,编译器是否可以决定不打扰调用func2()或func3(),因为它知道它们的返回值不可能影响分配给x的值?)
答案 0 :(得分:18)
不,无法保证调用函数的顺序。与||
不同,|
并不意味着序列点。
必须调用表达式中的所有函数,除非实现可以确定它们没有副作用,并且它可以在不实际调用其中一个函数的情况下确定表达式的结果。实现可以在“as if”规则下执行此操作,该规则允许实现执行合规程序无法观察或检测到的任何优化。
答案 1 :(得分:13)
它不会短路。它可能无序执行。
“评估方向不会影响在同一级别包含多个乘法(*),加法(+)或二进制按位(& | ^)运算符的表达式的结果。”