我最近遇到了一些我认为我马上就能理解的东西,但更多地思考它,我想理解它为什么会这样工作。
考虑下面的代码。这(x-- == 9)
显然正在接受评估,而(y++ == 11)
不是。我的第一个想法是合乎逻辑的&&
启动,发现表达式已经变为 false,并在计算表达式的第二部分之前退出。
我越想,就越不明白为什么会这样。据我了解,逻辑运算符的优先顺序低于增量运算。不应该(y++ == 11)
即使整个表达式已经变为假,仍要对其进行求值吗?
换句话说,操作顺序不应该规定(y++ == 11)
之前进行评估if
陈述意识到整个表达式将是错误的?
#include <iostream>
using namespace std;
int main( int argc, char** argv )
{
int x = 10;
int y = 10;
if( (x-- == 9) && (y++ == 11) )
{
cout << "I better not get here!" << endl;
}
cout << "Final X: " << x << endl;
cout << "Final Y: " << y << endl;
return 0;
}
Output:
Final X: 9
Final Y: 10
逻辑运算符按以下顺序低于增量运算
优先。
优先顺序是not执行顺序。它们是完全不同的概念。优先级顺序仅影响执行顺序,即操作数在其运算符之前进行计算,并且优先级顺序有助于告诉您每个运算符的操作数是什么。
即使对于操作数在运算符之前评估的规则来说,短路运算符也是部分例外,因为它们评估 LHS,然后运算符可以决定是否评估 RHS,maybe评估 RHS,然后计算运算符的结果。
不要认为优先级较高的操作“首先执行”。把它们想象成“结合得更紧”。++
优先级高于&&
,并且在表达式中x ++ && y ++
, 运算符优先级意味着++
“结合得更紧密”y
than &&
确实如此,因此表达式总体等效于(x++) && (y++)
, not (x++ && y) ++
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)