2010-12-04 7 views

Odpowiedz

9

Operator przecinka jest punktem sekwencji: każde wyrażenie rozdzielone przecinkiem jest oceniane od lewej do prawej. Wynik ma typ i wartość prawego argumentu. Funkcjonalnie, Twój przykład jest równoważne (o wiele bardziej czytelny):

else 
{ 
    *pbuf++ = '%'; 
    *pbuf++ = to_hex(*pstr >> 4); 
    *pbuf++ = to_hex(*pstr & 15); 
} 

Oto kolejny przykład, że standard przewiduje operatora przecinek (6.5.17):

w wywołaniu funkcji

f(a, (t=3, t+2), c) 

funkcja ma trzy argumenty, z których drugi ma wartość 5.

8

Z Wikipedii:

W językach C i C++ języków programowania, operatora przecinek (reprezentowany przez token) jest operatorem, który ocenia swój pierwszy argument i odrzuca wynik, a następnie ocenia drugiego argumentu i powraca ta wartość (i typ). Operator przecinka ma najniższy priorytet każdego operatora C i działa jako punkt sekwencyjny.

Użycie tokena przecinka jako operatora różni się od użycia w wywołaniach funkcji i definicjach, deklaracjach zmiennych, deklaracjach wyliczeniowych i podobnych konstrukcjach, gdzie działa jako separator.

W tym przykładzie różnice w zachowaniu między drugą a trzecią linią wynikają z tego, że operator przecinka ma niższy priorytet niż przypisanie.

int a=1, b=2, c=3, i; // comma acts as separator in this line, not as an operator 
i = (a, b);    // stores b into i        ... a=1, b=2, c=3, i=2 
i = a, b;    // stores a into i. Equivalent to (i = a), b;  ... a=1, b=2, c=3, i=1 
i = (a += 2, a + b); // increases a by 2, then stores a+b = 3+2 into i ... a=3, b=2, c=3, i=5 
i = a += 2, a + b;  // increases a by 2, then stores a = 5 into i  ... a=5, b=2, c=3, i=5 
i = a, b, c;   // stores a into i        ... a=5, b=2, c=3, i=5 
i = (a, b, c);   // stores c into i        ... a=5, b=2, c=3, i=3 

Link: http://en.wikipedia.org/wiki/Comma_operator

+0

W "i = a, b;", co się dzieje z "b"? Dlaczego ktoś miałby napisać "b" w tym przypadku? – MichaelChirico

0

Dlaczego nie powinno działać? Ustawia ona %, to_hex(*pstr >> 4), to_hex(*pstr & 15) na sekwencyjny blok pamięci adresowany przez pbuf. Odpowiedni kod może być następujący:

else { 
    *pbuf = '%'; 
    *(pbuf + 1) = to_hex(*pstr >> 4); 
    *(pbuf + 2) = to_hex(*pstr & 15); 
    pbuf += 3; 
} 
Powiązane problemy