了解C中的运算符

时间:2015-05-16 03:30:37

标签: c operators

我对运营商的基本问题感到震惊。这是问题

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的值。
这里有人请解释一下它是如何工作的。

2 个答案:

答案 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),并且jk不会递增。因此i变为4jk分别保留其初始值21

||运算符的结果是0(对于false)或1(对于true);由于条件为真,因此将值1分配给m

结果:

4 2 1 1