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
)永远不会被评估: j
和k
永远不会增加。
++
s在表达式之前不执行。 只执行++i
,表示表达式的结果为1,因此不评估表达式的其余部分(短路)。
您的代码相当于:
if (++i) m = 1; else if (!++j) m = 0; else if (!++i) m = 0; else m = 1;
这意味着一旦++i
被评估为true,则else
部分永远不会被执行。