2012-07-16 15 views
6

Proszę wyjaśnić mi, dlaczego zachowuje się inaczej.Dlaczego dane wyjściowe są różne?

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

Daje to wynik jako stackoverflow8. Jednakże, jeśli usunąć nawiasach, a następnie:

p = printf("stack"),printf("overflow"); daje wyjście jako stackoverflow5

Odpowiedz

13

The Comma Operator

Operator przecinek ma niższy priorytet niż przypisanie (posiada niższy priorytet niż każdy operatora dla tego materia), więc jeśli usuniesz nawiasy, zadanie zostanie wykonane najpierw, a wynik drugiego wyrażenia zostanie odrzucony. Więc ...

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; 

Zauważ, że trzecia linia spowoduje błąd, ponieważ jest interpretowany jako ponownej deklaracji b, tj

int y = a; 
int b; 

brakowało mi tego na początku, ale to sprawia, sens. Nie różni się od początkowej deklaracji a i b, w tym przypadku przecinek nie jest operatorem, jest separatorem.

+2

int y = a, b; jest równoważne int y = a; i int b; – h4ck3d

+0

Rozumiem. Dzięki. – h4ck3d

+0

@EdS. Próbowałem twojego kodu z gcc, a trzecie polecenie daje "redeclaration of" b "" i "poprzednią definicję" b "" błędu. – abelenky

Powiązane problemy