为什么这段代码打印1,-1

时间:2014-09-13 12:40:19

标签: c

以下是在线测试中向我询问的代码。考虑一下这段代码。

int i = -1, j = -1;
(i=0)&&(j=0);
(i++)&&(++j);
printf("%d, %d\n", i, j);

上面的代码将打印

1, -1

有人可以解释为什么输出结果是1, -1而不是1, 1

2 个答案:

答案 0 :(得分:6)

C对少数运营商进行短路评估。其中之一是&&。这意味着如果&&的左侧评估为false,则不会评估右侧。

此外,++ii++之间存在差异。 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时保持不变。 这里最好的讨论点是永远不要写这样的代码,调试和合理化是非常棘手的。