-7
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. 现在您可以应用短路,但这会产生错误的答案。这是为什么?

4

2 回答 2

4

优先级≠评估顺序。

||和的短路行为&&意味着首先评估它们的左侧,并且

  • 如果 LHS 的||计算结果为真(非零),则不计算 RHS(因为true无论 RHS 是什么,表达式都将是)
  • 如果 LHS 的&&计算结果为假(或零),则不计算 RHS(因为false无论 RHS 是什么,表达式都将是)

在您的示例中,被评估,并且等于 -2,它是非零的,因此(即)++i的右侧永远不会被评估:并且永远不会增加。||++j && ++kjk

于 2012-06-14T12:56:04.103 回答
1

++s 不在表达式之前执行。仅++i执行,表示表达式的结果将为 1,因此不计算表达式的其余部分(短路)。

您的代码相当于:

if (++i)
    m = 1;
else
    if (!++j)
        m = 0;
    else if (!++i)
        m = 0;
    else
        m = 1;

这意味着一旦++i评估为真,该else部分就永远不会执行。

于 2012-06-14T12:53:45.850 回答