了解 C 中的运算符
Understanding operators in C
我对运算符的一个基本问题感到震惊。问题来了
int i=3, j=2, k=1, m;
m = ++i || ++j && ++k;
printf("%d %d %d %d", i, j, k, m);
当我处理这个并将答案评估为
4 3 2 1
但 C 对我的回答不满意,并将上述评价为
4 2 1 1
但是我不明白怎么办。为什么 ++j 不更新 j 的值。而且 ++k 不会更新 k 的值。
任何人都请解释这是如何工作的。
在 C 中,||
是一个 short-circuit operator。这意味着在计算表达式 a || b
时,如果 a
为假,它只会计算 b
。如果 a
为真,那么无论 b
.
怎样,表达式都为真
由于++i
给出了一个真值,++j && ++k
将不会被计算。
m = ++i || ++j && ++k;
&&
运算符的优先级高于 ||
,因此相当于:
m = ++i || (++j && ++k);
&&
和||
都是短路运算符;如果左操作数确定结果,则不评估右操作数。由于 ++i
(产生 4
)是 "truthy",因此不计算右操作数 (++j && ++k)
,并且 j
和 k
不递增。所以i
变成了4
,j
和k
分别保留了它们的初始值2
和1
。
||
运算符的结果是 0
(假)或 1
(真);由于条件为真,值 1
被分配给 m
.
结果:
4 2 1 1
我对运算符的一个基本问题感到震惊。问题来了
int i=3, j=2, k=1, m;
m = ++i || ++j && ++k;
printf("%d %d %d %d", i, j, k, m);
当我处理这个并将答案评估为
4 3 2 1
但 C 对我的回答不满意,并将上述评价为
4 2 1 1
但是我不明白怎么办。为什么 ++j 不更新 j 的值。而且 ++k 不会更新 k 的值。
任何人都请解释这是如何工作的。
在 C 中,||
是一个 short-circuit operator。这意味着在计算表达式 a || b
时,如果 a
为假,它只会计算 b
。如果 a
为真,那么无论 b
.
由于++i
给出了一个真值,++j && ++k
将不会被计算。
m = ++i || ++j && ++k;
&&
运算符的优先级高于 ||
,因此相当于:
m = ++i || (++j && ++k);
&&
和||
都是短路运算符;如果左操作数确定结果,则不评估右操作数。由于 ++i
(产生 4
)是 "truthy",因此不计算右操作数 (++j && ++k)
,并且 j
和 k
不递增。所以i
变成了4
,j
和k
分别保留了它们的初始值2
和1
。
||
运算符的结果是 0
(假)或 1
(真);由于条件为真,值 1
被分配给 m
.
结果:
4 2 1 1