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 && ++kjk
++s 不在表达式之前执行。仅++i执行,表示表达式的结果将为 1,因此不计算表达式的其余部分(短路)。
您的代码相当于:
if (++i)
m = 1;
else
if (!++j)
m = 0;
else if (!++i)
m = 0;
else
m = 1;
这意味着一旦++i评估为真,该else部分就永远不会执行。