是否按位或保证评估顺序?

Posted

技术标签:

【中文标题】是否按位或保证评估顺序?【英文标题】:Does bitwise-or guarantee an evaluation ordering? 【发布时间】:2011-08-30 00:42:52 【问题描述】:

假设我有这个代码:

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

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

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

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

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

【问题讨论】:

与问题无关,但与现在已删除的答案有关:没有评论的三票否决?来吧伙计们,分享知识,别傻了。 @Answerer:您的答案的第一部分不正确,子表达式可以按 any 顺序计算;这可能就是您被否决的原因。 【参考方案1】:

不,无法保证函数将被调用的顺序。与|| 不同,| 不暗示序列点。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这很公平;下次只引用你的来源。 :-]

以上是关于是否按位或保证评估顺序?的主要内容,如果未能解决你的问题,请参考以下文章

在这种方法调用和传入参数的情况下,Java 评估顺序是不是得到保证

是否保证不会对 if 语句进行不必要的评估? [复制]

按位或 (题目)

结果之间的按位或

重载逗号运算符*真的*会影响其操作数的评估顺序吗?

评估布尔语句的顺序是啥? [复制]