++ 和 && 的运算符优先级
Operator precedence of ++ and &&
>我有以下代码
int a=0,b=5;
int c=a&&++b;
cout<<b;
当我运行此代码片段时,输出值为 5
.
根据我的理解,++
具有更大的运算符优先级,因此不应该在导致b
值6
的&&
之前++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+
并不意味着在这种情况下将首先对其进行评估。由编译器决定,因为它们之间没有直接的依赖关系。
相关文章:
- C++ 带有函数指针的运算符优先级
- <<运算符优先级与字符串比较
- 在一个指令中声明更多指针的运算符优先级
- C++逗号运算符的优先级
- 为什么括号在这种情况下无法更改c++运算符的优先级
- C++中的运算符优先级
- c++中的增量和三元运算符优先级
- 涉及模运算符优先级的错误以及C++中具有大数字的括号
- 带有 cout 和指针的运算符优先级
- C++ 使用矢量迭代器时的运算符优先级
- 好友与成员运算符重载的优先级
- 序列点和运算符优先级有什么区别
- 运算符优先级 括号问题
- C++表达式中的运算符优先级
- 相等运算符优先级不起作用
- 类构造函数比"="运算符具有更高的优先级?
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 如何使用将 const int 的运算符用作 int* 优先级队列的比较器
- 递增和按位移位运算符优先级?
- C++,计算具有多个"&&"且没有较低优先级运算符的表达式