2014-09-13 111 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