这是在线测试中向我询问的代码。考虑这个代码。为什么此代码正在打印1,-1
int i = -1, j = -1;
(i=0)&&(j=0);
(i++)&&(++j);
printf("%d, %d\n", i, j);
上面的代码将打印
1, -1
有人可以解释为什么输出出来是1, -1
而不是1, 1
。
这是在线测试中向我询问的代码。考虑这个代码。为什么此代码正在打印1,-1
int i = -1, j = -1;
(i=0)&&(j=0);
(i++)&&(++j);
printf("%d, %d\n", i, j);
上面的代码将打印
1, -1
有人可以解释为什么输出出来是1, -1
而不是1, 1
。
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;
如果考虑评估的顺序这是一种显而易见的。第一个& &只执行第一个任期。 i = 0之前& &评估。第二个& &也只执行第一个术语,因为后缀i ++评估为0,但是递增为1.因此,i = 1并且j在j = -1处保持不变。 这里最好的讨论点是从不写这样的代码,调试和合理化是非常棘手的。
Google for“短cicuit评价” – wildplasser 2014-09-13 12:41:46
说明你自己对代码的分析到目前为止 – 2014-09-13 12:42:28
@afzalex你知道答案了吗? – thumbmunkeys 2014-09-13 12:43:13