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