C中的运算符优先级和结合性

问题描述

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

Q 输出是什么?

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

解决方法

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)
,

我相信相等运算符优先于赋值运算符。 C 只是从左到右工作。

在 a = a == b == 0;

a 分配给等号右侧的所有内容。

在等号的右侧,a == b 的计算结果为 false。然后我们将 a==b 的答案的相等性与 0 进行比较。在 c 中,0 等于假,所以我们得到真。这是我们对“等号右边的所有内容”的回答。那么,我们将该值(真)分配给 a,它是一个整数。由于自动转换,true 被转换为 1 并分配给 a。现在 a 等于 1。

作为一个方程,上述过程可以表示为:a = (( a == b ) == 0)

希望这是有道理的。告诉我是否需要进一步澄清。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...