&= 和 |= 是不是有定义的评估顺序?

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() 的执行。

【讨论】:

以上是关于&= 和 |= 是不是有定义的评估顺序?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

排序点和评估顺序

短路评估顺序和前缀增量运算符

&& 之后的条件是不是总是被评估

XPath 是不是对逻辑表达式进行短路评估?