提问人:watercolour man 提问时间:4/2/2021 更新时间:4/3/2021 访问量:125
C 语言中的运算符优先级和关联性
operators precedence and associativity in C
问:
如果有人能帮我解决这个问题,我将不胜感激。我目前正在读的书有一个问题
问:输出是什么?
#include <stdio.h>
void main()
{
int a = 3, b = 2;
a = a ==b==0;
printf("%d, %d",a,b);
}
答案如下 1,2(即使在代码块上也得到了相同的答案) 现在我明白了相等运算符优先于赋值运算符。 所以它必须首先是 a== b 或 b == 0 那么由于上述两者都具有相同的运算符,因此关联性规则导致 a == b 首先进行评估。 但从现在开始,我迷失了! 如何得到 1 和 2 作为答案?
答:
0赞
theVerySharpFlat
4/2/2021
#1
我相信相等运算符不优先于赋值运算符。C 只是从左到右工作。
在 a = a == b == 0;
a 分配给等号右边的所有内容。
在等号的右侧,a == b 的计算结果为 false。然后我们将答案的相等性 a==b 与 0 进行比较。在 c 中,0 等于 false,因此我们得到 true。这是我们对“等号右边的一切”的回答。然后,我们将该值 (true) 分配给 a,它是一个整数。由于自动转换,true 被转换为 1 并分配给 a。现在 a 等于 1。
作为一个方程,上述过程可以表示为:a = (( a == b ) == 0)
希望这是有道理的。告诉我是否需要进一步澄清。
评论
0赞
watercolour man
4/3/2021
我猜 b 会保持 2,因为它的值没有改变?非常感谢您的帮助
0赞
theVerySharpFlat
4/3/2021
是的,没错!很高兴我能够提供帮助。
1赞
Kenny Ostrom
4/3/2021
#2
查看 https://en.cppreference.com/w/cpp/language/operator_precedence
请注意这一行,“具有相同优先级的运算符在其关联性方向上绑定到其参数。您可以在最右边的列上看到每个运算符的关联性。
请注意,相等运算符位于第 10 行,关联性从左到右。
请注意,赋值是第 16 行,因此它的优先级低于相等。
// original
a = a == b == 0
// precedence rule
a = (a == b == 0)
// associativity rule
a = ((a == b) == 0)
评论
0赞
watercolour man
4/3/2021
谢谢你,肯尼。现在知道了。
评论