在C++中a &= foo();
只是被a = a && foo();
取代了吗?
我关心的是foo()
的评估。如果a
为false,会调用它吗?
&&
是否嵌入了短路:您已经意识到了这一点。
&
没有任何短路的概念:它是一个需要对两个参数求值的运算符。
非正式地说a &= foo()
是a = a & foo()
的短手。(事实上,它比这更深一点:&=
可以原子操作,而长手版本则不会,因为赋值不是原子的。因此,你不能真正考虑编译器进行简单的替换。这里并不严格相关,但值得指出。)。
请注意未注释形式的单个&
:混淆的原因。因此不会有捷径。
它们不相同,a &= foo()
将等效于a = a & foo()
,因此按位和。不涉及短路。
这是位&
,而不是逻辑&&
。
因为它是按位的&
,所以将调用该函数,因为执行按位&
需要两个操作数。
如果你指的是一个逻辑&&
,你需要明确地拼写出来,正如你所写的:
a = a && foo();
在上述情况下,如果a
是false
,则它应该短路,并且foo()
将不会被调用。