以下是在线测试中向我询问的代码。考虑一下这段代码。
int i = -1, j = -1;
(i=0)&&(j=0);
(i++)&&(++j);
printf("%d, %d\n", i, j);
上面的代码将打印
1, -1
有人可以解释为什么输出结果是1, -1
而不是1, 1
。
答案 0 :(得分:6)
C对少数运营商进行短路评估。其中之一是&&
。这意味着如果&&
的左侧评估为false
,则不会评估右侧。
此外,++i
和i++
之间存在差异。 i++
将返回i
并存储i+1
。另一方面,++i
将返回i+1
并存储i+1
。
因此:
int i = -1, j = -1; // i = -1, j = -1
(i=0)&&(j=0); // i = 0, j = -1 (right hand side not evaluated because lhs evaluated to 0)
(i++)&&(++j); // i = 1, j = -1 (right hand side not evaluated because lhs evaluated to 0)
printf("%d, %d\n", i, j);
return 0;
答案 1 :(得分:3)
如果你考虑评估顺序,这很明显。第一个&&只执行第一个任期。 i = 0之前&&评估。第二个&&也只执行第一项,因为post fix i ++的计算结果为0,但是增加到1.因此i = 1且j在j = -1时保持不变。 这里最好的讨论点是永远不要写这样的代码,调试和合理化是非常棘手的。