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

我认为相等运算符不会优先于赋值运算符。 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)

希望这是有道理的。如果我需要进一步澄清,请告诉我。

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)