是否有针对&=和| =的定义评估顺序?

Ste*_*off 7 c variable-assignment

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

MyInt &= MyFunc();
Run Code Online (Sandbox Code Playgroud)

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

问题是:即使MyInt等于零,MyFunc()也能保证执行吗?

Likwise,如果我们使用按位OR赋值运算符(| =),那么MyFunc()总会被执行,即使MyInt设置为全部吗?

换句话说:对于按位运算符,C是否允许延迟评估?

Meh*_*ari 8

不.位运算符不会短路.MyFunc()无论价值如何,都可以保证执行MyInt.


小智 1

MyInt &= MyFunc();
Run Code Online (Sandbox Code Playgroud)

相当于:

MyInt = MyInt & MyFunc();
Run Code Online (Sandbox Code Playgroud)

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

  • 除了“MyInt”被评估**一次**(当它是一个具有副作用的表达式时可能很重要。) (2认同)