2014-09-13 88 views
-2

这是在线测试中向我询问的代码。考虑这个代码。为什么此代码正在打印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

+2

Google for“短cicuit评价” – wildplasser 2014-09-13 12:41:46

+0

说明你自己对代码的分析到目前为止 – 2014-09-13 12:42:28

+0

@afzalex你知道答案了吗? – thumbmunkeys 2014-09-13 12:43:13

回答

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; 
+0

为什么这个答案被降低了?如果你不喜欢这个线程,然后投票结束。我个人不太喜欢这些评论:我宁愿我是0等,而不是使用=。 – Bathsheba 2014-09-13 12:51:30

+0

我 - 不要喂恶劣的程序员 – 2014-09-13 12:52:19

+0

+1这不是问题的有趣之处,为什么我会为它付出低沉的代价?对不起,我发布了这个问题来分享知识,我认为它不是这样工作的。所以我会删除这个问题。我为此感到抱歉。 @sharth – afzalex 2014-09-13 12:52:45

3

如果考虑评估的顺序这是一种显而易见的。第一个& &只执行第一个任期。 i = 0之前& &评估。第二个& &也只执行第一个术语,因为后缀i ++评估为0,但是递增为1.因此,i = 1并且j在j = -1处保持不变。 这里最好的讨论点是从不写这样的代码,调试和合理化是非常棘手的。

+1

你得到一个+1试图回答一个愚蠢的问题 – 2014-09-13 13:07:39

+0

@EdHeal你为什么认为这是一个愚蠢的问题。我想清楚,我没有投票赞成他,甚至我提出的问题也不是由我创建的,当我在该网站进行测试时,它在一个好的网站上被问到我。 – afzalex 2014-09-13 13:13:43

+0

@EdHeal有人提高了rhubarbdog,因为他们发现他的答案很有用。你不应该那样说他。但是我想知道你为什么在考虑这个问题是不好的? – afzalex 2014-09-13 13:16:08