【问题标题】:Is there a defined evaluation order for &= and |=?&= 和 |= 是否有定义的评估顺序?
【发布时间】:2010-11-24 03:48:32
【问题描述】:

如果你有一个返回整数的 C 函数,你可以这样写:

MyInt &= MyFunc();

...我们使用按位与赋值运算符。

问题是:MyFunc() 是否保证被执行,即使 MyInt 等于 0?

同样,如果我们使用按位或赋值运算符 (|=),是否会始终执行 MyFunc(),即使 MyInt 设置为全 1?

换句话说:C 中是否允许对位运算符进行惰性求值?

【问题讨论】:

    标签: c variable-assignment


    【解决方案1】:
    MyInt &= MyFunc();
    

    相当于:

    MyInt = MyInt & MyFunc();
    

    语言声明 & 运算符没有短路。然而, 如果 MyInt,优化器可以生成不调用函数的代码 为零,并且可以肯定该功能没有副作用。我怀疑任何编译器实际上都会这样做,因为运行时测试可能会使它变得悲观。

    【讨论】:

    • 除了 MyInt 被评估一次(当它是一个有副作用的表达式时可能很重要。)
    • 作业的 LHS 上的东西不会被评估。
    • Neil:考虑myMap["test"] |= 10; myMap.operator[] 打印的东西。它会在第二种形式中打印两次,但在复合作业形式中打印一次。
    • @Mehrdad 考虑到这个问题被标记为 C,而不是 C++。
    • 属性被添加到 C++0X 中——我不记得是否有纯属性——但它是一些编译器已经拥有的属性概念的标准化。包括 gcc。 caf 建议在这里使用 gcc 扩展。
    【解决方案2】:

    没有。位运算符不会短路。无论MyInt 的值如何,都保证MyFunc() 的执行。

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 2019-04-30
      • 2011-08-30
      • 1970-01-01
      相关资源
      最近更新 更多