我对运营商的基本问题感到震惊.这是问题所在
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的值.
这里的任何人请解释它是如何工作的.
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变得4和j和k保留它们的初始值2和1分别.
||运算符的结果是0(对于false)或1(对于true); 由于条件为真,因此将值1赋值给m.
结果:
4 2 1 1
Run Code Online (Sandbox Code Playgroud)