了解 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),并且 jk 不递增。所以i变成了4jk分别保留了它们的初始值21

|| 运算符的结果是 0(假)或 1(真);由于条件为真,值 1 被分配给 m.

结果:

4 2 1 1