++和&&的运算符优先级

时间:2014-09-16 14:53:13

标签: c++

我有以下代码

int a=0,b=5;
int c=a&&++b;
cout<<b;

运行此代码段时,输出值为5

根据我的理解,++具有更高的运算符优先级,因此在++b导致&&的值之前不应评估b6

为什么b中的值不会增加?是因为我误解了优先权还是其他一些特征?

2 个答案:

答案 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+,所以并不意味着在这种情况下它将首先被评估。它由编译器来决定,因为它们之间没有直接的依赖关系。