我有以下代码
int a=0,b=5;
int c=a&&++b;
cout<<b;
运行此代码段时,输出值为5
。
根据我的理解,++
具有更高的运算符优先级,因此在++b
导致&&
的值之前不应评估b
是6
?
为什么b
中的值不会增加?是因为我误解了优先权还是其他一些特征?
答案 0 :(得分:7)
优先权不是重要的。
&&
执行短路评估,因此首先评估其左操作数。然后,当且仅当它不为零时,才会计算其右操作数。
在您的情况下,其左操作数为零,因此不评估其右操作数。因此,永远不会评估++b
,因此b
的值不会更改。
答案 1 :(得分:0)
您误解了运算符优先级在语言中的含义。它没有定义评估的顺序,而是定义了语法分析的表达方式。
让我们看看表达式:
*ptr++ = b + c / d;
运算符优先级表示它编译为:
( *(ptr++) ) = ( b + ( c / d ) );
不
( *( (ptr++) = b ) + c ) / d;
或类似的东西。但它没有定义他们直接评估的顺序。
回到原文:
( *(ptr++) ) = ( b + ( c / d ) );
在这种情况下,我们operator=
需要operator*
的输出和operator+
的输出,因此必须在分配前评估这些运算符,operator+
需要operator/
的输出1}}所以operator/
必须在operator+
之前进行评估,依此类推。但是因为operator*
的优先级高于operator+
,所以并不意味着在这种情况下它将首先被评估。它由编译器来决定,因为它们之间没有直接的依赖关系。