int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
由于在 C 中++
比||
和具有更高的优先级&&
,因此首先对它们求值,因此表达式变为m = -2 || 3 && 1
. 现在您可以应用短路,但这会产生错误的答案。这是为什么?
||
和的短路行为&&
意味着首先评估它们的左侧,并且
||
计算结果为真(非零),则不计算 RHS(因为true
无论 RHS 是什么,表达式都将是)&&
计算结果为假(或零),则不计算 RHS(因为false
无论 RHS 是什么,表达式都将是)在您的示例中,被评估,并且等于 -2,它是非零的,因此(即)++i
的右侧永远不会被评估:并且永远不会增加。||
++j && ++k
j
k
++
s 不在表达式之前执行。仅++i
执行,表示表达式的结果将为 1,因此不计算表达式的其余部分(短路)。
您的代码相当于:
if (++i)
m = 1;
else
if (!++j)
m = 0;
else if (!++i)
m = 0;
else
m = 1;
这意味着一旦++i
评估为真,该else
部分就永远不会执行。