2012-07-16 13 views
6

Bitte erklären Sie mir, warum es sich anders verhält.Warum ist der Ausgang anders?

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

Dies gibt die Ausgabe als stackoverflow8. wenn ich die geklam- mert jedoch entfernen, dann:

p = printf("stack"),printf("overflow"); gibt die Ausgabe als stackoverflow5

Antwort

13

The Comma Operator

Der Komma-Operator niedrigere Priorität als Zuweisung hat (es hat eine niedrigere Priorität als jeder Betreiber für das Wenn Sie die Klammern entfernen, wird die Zuweisung zuerst ausgeführt und das Ergebnis des zweiten Ausdrucks wird verworfen. So ...

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; 

Beachten Sie, dass die dritte Zeile einen Fehler verursachen, da es als eine erneute Erklärung von b interpretiert wird, das heißt:

int y = a; 
int b; 

vermisste ich dies auf den ersten, aber es macht Sinn. Es ist nicht anders als die ursprüngliche Deklaration von a und b, und in diesem Fall ist das Komma kein Operator, es ist ein Separator.

+2

int y = a, b; entspricht int y = a; und int b; – h4ck3d

+0

Verstanden. Vielen Dank. – h4ck3d

+0

@EdS. Ich habe Ihren Code mit gcc ausprobiert, und die 3. Anweisung gibt eine "Neudefinition von 'b'" und "vorherige Definition von 'b'" Fehler. – abelenky

Verwandte Themen