C中的优先与短路

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 m = -2 || 3 && 1 。 现在你可以应用短路但产生错误的答案。 这是为什么?

优先顺序≠评估顺序。

||的短路行为 和&&表示首先评估他们的左侧,并且

  • 如果是||的LHS 求值为true(非零),不评估RHS(因为无论RHS是什么,表达式都是true
  • 如果&&的LHS评估为假(或零),则不评估RHS(因为无论RHS是什么,表达式都将为false

在你的例子中, ++i被评估,并且等于-2,这是非零的,所以在||的右边。 (即, ++j && ++k )永远不会被评估: jk永远不会增加。

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

您的代码相当于:

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

这意味着一旦++i被评估为true,则else部分永远不会被执行。