了解C中的运算符

Pan*_*ash 0 c operators

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

int i=3, j=2, k=1, m;
m = ++i || ++j  && ++k;
printf("%d %d %d %d", i, j, k, m);
Run Code Online (Sandbox Code Playgroud)

当我研究这个并将ans评估为

4 3 2 1

但是C对我的ans并不满意,并将上述评估为

4 2 1 1

但我不明白怎么做.为什么++ j不会更新j的值.并且++ k不会更新k的值.
这里的任何人请解释它是如何工作的.

grc*_*grc 5

在C中,||短路运算符.这意味着在评估表达式时a || b,它只会评估bif是否a为false.如果a为true,那么无论如何,表达式总是为真b.

由于++i给出了真值,++j && ++k因此不予评估.


Kei*_*son 5

 m = ++i || ++j  && ++k;
Run Code Online (Sandbox Code Playgroud)

&&运营商的优先级高于||,所以这相当于:

 m = ++i || (++j && ++k);
Run Code Online (Sandbox Code Playgroud)

二者&&||有短路操作员; 如果左操作数确定结果,则不评估右操作数.由于++i(其产生4)为"truthy",右边的操作数(++j && ++k)没有评价,j并且k不递增.因此i变得4jk保留它们的初始值21分别.

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

结果:

4 2 1 1
Run Code Online (Sandbox Code Playgroud)