2012-07-16 214 views
6

請解釋爲什麼它的行爲有所不同。爲什麼輸出不同?

int main() { 
    int p; 
    p = (printf("stack"),printf("overflow")); 
    printf("%d",p); 
    return 0; 
    } 

這給出了輸出爲stackoverflow8。但是,如果我刪除paranthesis,則:

p = printf("stack"),printf("overflow");使輸出stackoverflow5

回答

13

The Comma Operator

逗號操作符具有比分配較低的優先級(它比任何運營商應該是一個優先級較低問題),所以如果刪除括號,則首先進行賦值,並放棄第二個表達式的結果。所以......

int a = 10, b = 20; 
int x = (a,b); // x == 20 
int y = a,b; // y == 10 
// equivalent (in terms of assignment) to 
//int y = a; 

注意第三個行會導致錯誤,因爲它被解釋爲b重新聲明,即:

int y = a; 
int b; 

我錯過了在第一,但它使感。它與ab的初始聲明沒有區別,在這種情況下,逗號不是操作符,而是分隔符。

+2

int y = a,b;相當於int y = a;和int b; – h4ck3d 2012-07-16 19:02:07

+0

明白了。謝謝。 – h4ck3d 2012-07-16 19:04:15

+0

@EdS。我用gcc試過你的代碼,第三條語句確實給出了「b'的重新聲明」和「b'的先前定義」錯誤。 – abelenky 2012-07-16 19:04:22

相關問題