位或运算符是否保证了评估顺序?

16

假设我有以下代码:

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
不涉及问题,而是针对一个已删除的回答:三个没有评论的踩?来吧,伙计们,分享知识,不要傻。@回答者:您回答的第一部分是错误的,子表达式可以按任何顺序评估;这可能是您被踩的原因。 - GManNickG
2个回答

19

不,没有保证函数被调用的顺序。与||不同的是,|不意味着有一个序列点。

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


13

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

“表达式中包含一个以上相同级别的乘法(*)、加法(+)或二进制位(& | ^)运算符时,求值的顺序不会影响结果。”


4
好的,下次请注明你的来源。:-] - ildjarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接