【问题标题】: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 顺序计算;这可能就是您被否决的原因。

标签: c++ short-circuiting operator-precedence bitwise-or


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这很公平;下次只引用你的来源。 :-]
    猜你喜欢
    • 2013-10-18
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多