C++ 按位还是保证计算顺序?

C++ 按位还是保证计算顺序?,c++,short-circuiting,operator-precedence,bitwise-or,C++,Short Circuiting,Operator Precedence,Bitwise Or,假设我有这个代码: unsigned int func1(); unsigned int func2(); unsigned int func3(); unsigned int x = func1() | func2() | func3(); C++是否保证函数1将被调用,然后函数2(),然后函数3()? 或者,编译器是否可以按自己喜欢的顺序调用函数 此外,如果编译器愿意,是否允许它在此处实现短路优化?(例如,如果func1()返回~0,编译器是否可以决定不调用func2()或func3(

假设我有这个代码:

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

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

C++是否保证函数1将被调用,然后函数2(),然后函数3()? 或者,编译器是否可以按自己喜欢的顺序调用函数


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

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


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

否,无法保证调用函数的顺序。与
| |
不同,
|
并不表示序列点


必须调用表达式中的所有函数,除非实现可以确定它们没有副作用,并且可以确定表达式的结果,而无需实际调用其中一个函数。实施可根据“仿佛”规则执行此操作,该规则允许实施执行一致性程序无法观察或检测到的任何优化。

与问题无关,但与现已删除的答案有关:三次否决票,无评论?来吧,伙计们,分享知识,别傻了@回答者:你回答的第一部分不正确,子表达式可以按任何顺序计算;这可能就是你被否决的原因;下次只需引用您的来源即可。:-]