2012-06-14 26 views
-5
int i=-3, j=2, k=0, m; 
m = ++i || ++j && ++k; 
printf("%d, %d, %d, %d\n", i, j, k, m); 

由於++具有多個優先級比用C ||&&,它們首先被評估,因此,表達式變爲m = -2 || 3 && 1。現在,您可以應用短路,但會產生不正確的答案。這是爲什麼?Precendence VS短路用C

+3

omg roflmoa wut iz the prblm herr ?? –

+4

這就像我眼中的派對,只有邪惡的小丑被邀請。 –

+3

你得到的輸出是什麼,你期望的輸出是什麼? – Jay

回答

1

++ s在表達式之前不執行。只有++i執行,這表明表達式的結果將爲1,因此表達式的其餘部分不會被評估(短路)。

您的代碼就相當於:

if (++i) 
    m = 1; 
else 
    if (!++j) 
     m = 0; 
    else if (!++i) 
     m = 0; 
    else 
     m = 1; 

這意味着,一旦++i被評估爲true,則永遠不會執行else部分。

4

Precedence ≠ order of evaluation.

||&&的短路行爲意味着它們的左手側被首先計算,並且

  • 如果||的LHS評估爲真(非零)時,RHS (因爲不管什麼RHS,表達式將是true
  • 如果&&的LHS評估爲假(或零),則不評估RHS(因爲exp ression將false不管RHS是什麼)

在你的榜樣,++i得到評估,並等於-2,這是零,所以||的右手邊(即++j && ++k )永遠不會被評估:jk永遠不會增加。

+0

如果我們有'!(++ i || ++ j && ++ k)'而不是'j'和'k'是否增加? – Pacerier