&= 和 |= 是不是有定义的评估顺序?
Posted
技术标签:
【中文标题】&= 和 |= 是不是有定义的评估顺序?【英文标题】:Is there a defined evaluation order for &= and |=?&= 和 |= 是否有定义的评估顺序? 【发布时间】:2010-11-24 03:48:32 【问题描述】:如果你有一个返回整数的 C 函数,你可以这样写:
MyInt &= MyFunc();
...我们使用按位与赋值运算符。
问题是:MyFunc() 是否保证被执行,即使 MyInt 等于 0?
同样,如果我们使用按位或赋值运算符 (|=),是否会始终执行 MyFunc(),即使 MyInt 设置为全 1?
换句话说:C 中是否允许对位运算符进行惰性求值?
【问题讨论】:
【参考方案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()
的执行。
【讨论】:
以上是关于&= 和 |= 是不是有定义的评估顺序?的主要内容,如果未能解决你的问题,请参考以下文章