zauważyłem w rutynowymCzym jest zestaw przydziałów rozdzielany przecinkami?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
Dlaczego to działa?
Co robi?
zauważyłem w rutynowymCzym jest zestaw przydziałów rozdzielany przecinkami?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
Dlaczego to działa?
Co robi?
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.
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
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;
}
W "i = a, b;", co się dzieje z "b"? Dlaczego ktoś miałby napisać "b" w tym przypadku? – MichaelChirico