我对运营商的基本问题感到震惊。这是问题
int i=3, j=2, k=1, m;
m = ++i || ++j && ++k;
printf("%d %d %d %d", i, j, k, m);
当我研究这个并将ans评估为
时4 3 2 1
但是C对我的ans感到不满意,并将上述内容评估为
4 2 1 1
但我不明白怎么做。为什么++ j不会更新j的值。并且++ k不会更新k的值。
这里有人请解释一下它是如何工作的。
答案 0 :(得分:5)
在C中,||
是short-circuit operator。这意味着在评估表达式a || b
时,如果b
为false,则仅评估a
。如果a
为真,则无论b
如何,表达式始终为真。
由于++i
给出了真值,因此不会评估++j && ++k
。
答案 1 :(得分:5)
m = ++i || ++j && ++k;
&&
运算符的优先级高于||
,因此相当于:
m = ++i || (++j && ++k);
&&
和||
都是短路运营商;如果左操作数确定结果,则不评估右操作数。由于++i
(产生4
)是“真实的”,因此不评估右操作数(++j && ++k)
,并且j
和k
不会递增。因此i
变为4
,j
和k
分别保留其初始值2
和1
。
||
运算符的结果是0
(对于false)或1
(对于true);由于条件为真,因此将值1
分配给m
。
结果:
4 2 1 1