C 语言中的运算符优先级和关联性

operators precedence and associativity in C

提问人:watercolour man 提问时间:4/2/2021 更新时间:4/3/2021 访问量:125

问:

如果有人能帮我解决这个问题,我将不胜感激。我目前正在读的书有一个问题

问:输出是什么?

#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 作为答案?

等于 相等 运算符优先级 关联性

评论

1赞 watercolour man 4/2/2021
使用 C Byron Gottfied 编程,由 jitender chhabra 修订。它似乎是合法的

答:

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
谢谢你,肯尼。现在知道了。