2010-07-30 26 views
6

我不理解下面的程序的輸出的表達的實際結果:請解釋&&與||的優先級之間的明顯衝突和

#include<stdio.h> 

int main() 
{ 
    int i=-3, j=2, k=0, m; 
    m = ++i || ++j && ++k; 
    printf("%d %d %d %d\n", i, j, k, m); 
    return 0; 
} 

輸出是-2 2 0 1代替-2 3 1 1,這意味着++i進行評價(並引起||操作者短在表達式++j && ++k之前打開它的右側),這似乎與&&運營商的優先級高於||的事實相矛盾。

有人會解釋爲什麼嗎?

+1

m的類型是什麼? – 2010-07-30 20:18:09

+0

米是整數類型 我知道前面回答...我需要交代 爲什麼爲k = 0 – anurag 2010-07-30 20:20:35

+4

'j'和'k'從不增加,因爲表達式的那部分被短路。 '++ i'是真的,所以表達式的其餘部分不被評估。 – 2010-07-30 20:23:21

回答

2

表達:

++i || ++j && ++k 

相當於:

(++i) || ((++j) && (++k)) 

解釋:

  1. ++i評價 - (-2) || ((++j) && (++k));
  2. ||運營商評估 - (1);

由於1 || anything evalutes爲真,因此不計算右操作數。因此,&&的優先順序並不重要。這種短路通過相關標準在C和C++中得到保證(見Is short-circuiting logical operators mandated? And evaluation order?)。

現在,請嘗試使用一個子表達式,像這樣:

(++i || ++j) && ++k 

即相當於:

((++i) || (++j)) && (++k) 

解釋:

  1. ++i評估 -​​;
  2. ||評價 - (1) && (++k)
  3. ++k評價 - (1) && (1);
  4. 評估爲真;
3

-2 2 0 1

懶惰。

#include <stdio.h> 

int main() 
{ 

int i=-3,j=2,k=0; 
int m=++i||++j&&++k; 

printf("%d %d %d %d",i,j,k,m); 

} 

編譯,運行,看看你自己。

gcc tmp.c -o tmp 
+0

我的想法正確 – Tom 2010-07-30 20:19:19

+1

不應該&&先執行,因爲更高的優先? – anurag 2010-07-30 20:23:09

+0

不,這個在Jerry Coffin的回答中得到了很好的解釋。 OP和其他人只是有一個理解問題。 – 2010-07-30 20:48:37

22

輸出應該是這樣的:

Error, line 2: 'm': undefined variable. 

編輯:與固定的,只有++i進行評估。優先級不會確定(或甚至影響)評估順序。優先級表示該表達式相當於++i || (++j && ++k)||&&的評估順序始終是評估左操作數,然後是序列點。在序列點之後,當且僅當有必要確定最終結果時評估右操作數(即,如果左操作數評估爲零,則評估||的右操作數;如果評估左操作數評估右操作數&&非零)。

在該表達式中,對++i進行了評估,然後因爲它是||的左操作數,並且評估結果爲非零,則表達式的其餘部分都不會被評估。

+1

+1讓我笑了起來。我同意。 :D – 2010-07-30 20:20:57

+0

它原本就是一行,其中m是其餘部分的聲明的一部分。分手時,編輯器顯然會分裂線條,插入錯誤。 – 2010-07-30 20:23:02

+0

@詹姆斯 - 即使是單線,k和m之間也有一個';'。 – 2010-07-30 20:41:01

0

通過解釋:

#include <stdio.h> 

int main() 
{ 
    if (-1) 
     printf ("-1!\n"); 
    else 
     printf ("Not -1.\n"); 
    return 0; 
} 

負數是不是C.假布爾值始終比較爲0(或FALSE),也可以通過if (worked == TRUE)給漏報得到咬傷。