是否按位或保证评估顺序?
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】:不会短路。它可能会乱序执行。
“计算的方向不会影响在同一级别包含多个乘法 (*)、加法 (+) 或二进制位 (& | ^) 运算符的表达式的结果。”
【讨论】:
这很公平;下次只引用你的来源。 :-]以上是关于是否按位或保证评估顺序?的主要内容,如果未能解决你的问题,请参考以下文章