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

Operator precedence of ++ and &&

本文关键字:优先级 运算符      更新时间:2023-10-16

>我有以下代码

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

当我运行此代码片段时,输出值为 5 .

根据我的理解,++具有更大的运算符优先级,因此不应该在导致b6&&之前++b进行评估吗?

为什么b中的值没有递增?是因为我误解了优先级还是其他功能?

优先级

在这里并不重要。

&&进行短路评估,因此首先评估其左操作数。然后当且仅当它不为零时,计算其右操作数。

在您的情况下,其左操作数

为零,因此不会计算其右操作数。因此,永远不会评估++b,因此不会更改b的值。

您误解了运算符优先级在语言中的含义。它不定义计算顺序,而是定义表达式语法解析方式。

让我们看看表达式:

*ptr++ = b + c / d;

运算符优先级意味着它编译为:

( *(ptr++) ) = ( b + ( c / d ) );

不:

( *( (ptr++) = b ) + c ) / d;

或类似的东西。但它没有定义他们直接评估的顺序。

所以回到原点:

( *(ptr++) ) = ( b + ( c / d ) );

在这种情况下,我们有operator=它需要operator*的输出和operator+的输出,因此必须在分配之前评估这些运算符,operator+需要operator/的输出,因此必须在operator+之前评估operator/等等。但是operator*的优先级高于operator+并不意味着在这种情况下将首先对其进行评估。由编译器决定,因为它们之间没有直接的依赖关系。