我知道在C语言中的逻辑运算符采用短路规则,但我的疑问是短路规则和运算符优先级规则是否相互矛盾。请看下面的例子:
#include<stdio.h>
int main()
{
int a;
int b=5;
a=0 && --b;
printf("%d %d",a,b);
return 0;
}
根据优先级规则,前缀运算符的优先级最高。所以应该先计算
--b
,然后是 &&
,最后将结果赋值给 a
。因此,期望输出应为 0 4
。但在这种情况下,&&
的第二个操作数实际上从未执行,结果变成了 0 5
。为什么这里没有应用优先级规则?逻辑运算符是否豁免优先级规则?如果是,还有哪些运算符会显示这样的行为?这种行为背后的逻辑是什么?
+
、*
和<<
这样的运算符没有定义的评估顺序。编译器可以随意处理,程序员不得编写依赖于任何特定顺序的代码。a + b
可以先计算a
再计算b
,也可以先计算b
再计算a
,甚至可以交织它们的计算。因此,为了安全起见并确保编译器按照所需的方式计算表达式,括号是一个神奇的解决方法吗?例如(a) + (b)
。或者是否存在即使使用括号也不会影响编译器特定评估的情况? - RobertS supports Monica Cellio,
(逗号运算符)、&&
或||
这样的运算符。 - John Kugelman+
和*
没有特定的顺序,但是这个表格:https://en.cppreference.com/w/c/language/operator_precedence 显示它们的顺序是从左到右,为什么会这样呢? - LocalHost