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 == (y = z)
时最后一行打印出 x = 1。我无法找出 1 的含义和操作的优先级。希望可以有人帮帮我! :)
在最后一条语句中,没有任何内容改变 x 的值。我们正在测试 x 是否等于某个值,但我们不会更改它的值。
因此它继续具有与前一个语句中相同的值,特别是值 1。
原因是因为 == 运算符检查 2 个数字是否相等,returns 如果相等则为 1,如果不相等则为 0,这就是为什么它 returns 可以检查的原因x= 1 和 y=2 并在它们之间使用 == 运算符
最后一条语句没有改变 x
的值,所以它的值保持不变。
Parens 用于覆盖优先级,强制 =
成为 ==
的操作数。
运算符的操作数必须先于运算符本身求值,因此我们知道以下内容:
y
在 =
. 之前的某个时间点求值
z
在 =
. 之前的某个时间点求值
x
在 ==
. 之前的某个时间点求值
=
在 ==
. 之前的某个时间点求值
就是这样。所有这些都是有效的订单:
z
y
=
x
==
y
z
=
x
==
x
y
z
=
==
- 等等
但是每当 x
、y
和 z
被评估时,我们可以指望发生以下情况:
=
将 z
的值(当前为 4
)分配给 y
和 returns 它。
==
将 x
的值(当前为 1
)与 =
返回的值(4
)进行比较。由于它们不同,==
returns 0
(没有被任何东西使用)。
如您所见,没有任何变化 x
,因此它仍然具有之前的值 (1
)。
x
的比较结果和y
与(y = z)
的赋值被丢弃。最后一行可能会删除比较:y = z; PRINTX;
.
后来也没有使用赋值,所以该行可能是 PRINTX;
。
我要分析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 == (y = z)
时最后一行打印出 x = 1。我无法找出 1 的含义和操作的优先级。希望可以有人帮帮我! :)
在最后一条语句中,没有任何内容改变 x 的值。我们正在测试 x 是否等于某个值,但我们不会更改它的值。
因此它继续具有与前一个语句中相同的值,特别是值 1。
原因是因为 == 运算符检查 2 个数字是否相等,returns 如果相等则为 1,如果不相等则为 0,这就是为什么它 returns 可以检查的原因x= 1 和 y=2 并在它们之间使用 == 运算符
最后一条语句没有改变 x
的值,所以它的值保持不变。
Parens 用于覆盖优先级,强制 =
成为 ==
的操作数。
运算符的操作数必须先于运算符本身求值,因此我们知道以下内容:
y
在=
. 之前的某个时间点求值
z
在=
. 之前的某个时间点求值
x
在==
. 之前的某个时间点求值
=
在==
. 之前的某个时间点求值
就是这样。所有这些都是有效的订单:
z
y
=
x
==
y
z
=
x
==
x
y
z
=
==
- 等等
但是每当 x
、y
和 z
被评估时,我们可以指望发生以下情况:
=
将z
的值(当前为4
)分配给y
和 returns 它。==
将x
的值(当前为1
)与=
返回的值(4
)进行比较。由于它们不同,==
returns0
(没有被任何东西使用)。
如您所见,没有任何变化 x
,因此它仍然具有之前的值 (1
)。
x
的比较结果和y
与(y = z)
的赋值被丢弃。最后一行可能会删除比较:y = z; PRINTX;
.
后来也没有使用赋值,所以该行可能是 PRINTX;
。