逻辑与,或:可以保证从左到右的评估吗?

| 是否可以保证从左到右评估逻辑运算符(
&&
||
)? 假设我有这个:
SDL_Event event;

if (SDL_PollEvent(&event)) {
    if (event.type == SDL_QUIT) {
            // do stuff
    }
}
是否保证与此相同?
SDL_Event event;

if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
    // do stuff
}
这也可能非常重要,假设我们有两个要求,分别是
a
b
。要求
a
b
失败的可能性更大。那么说
if (a && b)
if (b && a)
更有效。     
已邀请:
是的,这是可以保证的,否则此类操作员将失去很多用处。 重要说明:这仅对内置的
&&
||
有效;如果某些犯罪分子使它们重载,则将它们视为“常规”重载二进制运算符,因此在这种情况下,总是对两个操作数进行求值,并且照常以未指定的顺序进行求值。因此,请不要重载它们-这打破了关于程序控制流的极其重要的假设。 相关标准报价 内置的
&&
||
保证了短路行为 §5.14¶1   与
&
不同,
&&
保证从左到右求值:如果第一个操作数为
false
,则不对第二个操作数求值。 §5.15¶1   与
|
不同,
||
保证从左到右的评估;此外,如果第一个操作数的值为“ 19”,则不计算第二个操作数。 如果过载,它们将充当“常规”二进制运算符(无短路或保证评估的顺序) §13.5¶9   在第13.5.3至13.5.7节中未明确提及的运算符充当服从13.5.1或13.5.2规则的普通一元和二进制运算符。 这些小节中未明确提及and0ѭ和ѭ1,,因此常规的第13.5.2节适用: §13.5.2¶1   二进制运算符应通过具有一个参数的非静态成员函数(9.3)或具有两个参数的非成员函数来实现。因此,对于任何二进制运算符
@
,都可以解释为interpreted23 interpreted   如
x.operator@(y)
operator@(x,y)
。 没有对仅评估一方或按特定顺序进行评估的特殊规定。 (所有引用均来自C ++ 11标准)     

要回复问题请先登录注册