提问人:AgusBFU 提问时间:12/4/2020 最后编辑:EugeneAgusBFU 更新时间:12/4/2020 访问量:59
C 运算符中的优先级 == 和 ( = )
Precedence in C operators == and ( = )
问:
我必须分析 C 语言中的一些代码是做什么的,并且我对某一行中发生的事情有疑问。代码是
#define PRINTX printf("%d\n", x)
void problem() {
int x = 2, y, z;
x *= 3 + 2; PRINTX;
x *= y = z = 4; PRINTX;
x = y == z; PRINTX;
x == (y = z); PRINTX; // This line is the problem
}
此代码片段打印生成的数字:
10
40
1
1 // This result **
问题是我仍在试图弄清楚为什么最后一行打印出 x = 1,而操作是 .我很难弄清楚 1 的含义和操作的优先级。希望有人能帮助我!:)x == (y = z)
答:
0赞
Bill Lynch
12/4/2020
#1
在最后一个语句中,没有任何东西会改变 x 的值。我们正在测试 x 是否等于某物,但我们不会改变它的值。
因此,它继续具有与上一条语句相同的值,特别是值 1。
0赞
abhinav bandaru
12/4/2020
#2
原因是因为 == 运算符检查 2 个数字是否相等,如果相等则返回 1,如果不相等则返回 0,这就是为什么它返回一个您可以通过使 x= 1 和 y=2 并在它们之间使用 == 运算符来检查的原因
评论
0赞
ikegami
12/4/2020
OP问为什么在最后一行之后。你正在解释倒数第二行,他们似乎并不奇怪。x
1
3赞
ikegami
12/4/2020
#3
最后一个语句中没有任何内容更改 的值,因此其值保持不变。x
Parens 用于覆盖优先级,强制 成为 的操作数。=
==
运算符的操作数必须在运算符本身之前进行计算,因此我们知道以下几点:
y
在 之前的某个时间点进行计算。=
z
在 之前的某个时间点进行计算。=
x
在 之前的某个时间点进行计算。==
=
在之前的某个时间点进行评估。==
就是这样。所有这些都是有效的订单:
z
y
=
x
==
y
z
=
x
==
x
y
z
=
==
- 等。
但是,每当 和 被评估时,我们可以指望发生以下情况:x
y
z
=
将 (current ) 的值赋值并返回它。z
4
y
==
将 (current) 的值与 () 返回的值进行比较。由于它们是不同的,因此返回(没有被任何东西使用)。x
1
=
4
==
0
如您所见,没有任何变化,因此它仍然具有以前具有的值()。x
1
0赞
chux - Reinstate Monica
#4
放弃 with 的比较结果和赋值。最后一行可能会删除比较:。x
y
(y = z)
y = z; PRINTX;
随后也没有使用该赋值,因此该行可能是 .PRINTX;
评论
#define PRINTX printf("%d\n", x)