我对以下计划有疑问。
int main()
{
int i = -3,j = 2, k = 0,m;
m = ++i || ++j && ++k;
printf("%d %d %d %d\n", i, j, k, m);
return 0;
}
我得到的输出为-2 2 0 1
。
在OR操作中,如果第一个值为真,那么它将不会评估第二个值i = -2
和j =2
。
然后是AND操作。它会检查两个值是否为true。如果k = 1
则为m = 1
。
所以输出应该是-2 2 1 1
。我运行并检查输出为-2 2 0 1
,但我无法理解。
答案 0 :(得分:8)
你使用了短路或。由于++ i的计算结果为-2,它不是0,因此它会短路并且不会评估表达式的其余部分。结果,j或k都不会增加。
还要注意短路运算符,||和&&,是左联想的和那个||优先级高于&&。结果,||首先评估,如果左侧评估为真,则提前评估,而&&如果左侧评估为假,则提前退出。
编辑:修正了解释优先权的错误。
答案 1 :(得分:6)
评估||
后没有任何内容,因为表达式++i
的结果非零。