26
Słów kilka o [in/de]krementacji
Pewien link, który dostałem dziś od znajomego skłonił mnie do napisania tego wpisu. Nie będzie to zwykły post o inkrementacji/dekrementacji, bo chyba każdy wie jak to działa (a jeśli nie wie, to w sieci znajduje się wiele przykładów i wyjaśnień). Zajmijmy się (++) i (–) z poziomu parsera.
Oczywiście informacja wrzucona na grupę dyskusyjną (o „nowym” operatorze) jest nieprawdziwa.
while( x --> 0 )
to tak naprawdę:
while( x-- > 0 )
Zastanówmy się jak parser traktuje różne zbitki znaków plus i minus. Poniżej prezentuję krótką listę przykładów inkrementacji, dekrementacji oraz samego dodawania. Wszystko było testowane pod różnymi wersjami gcc or mingw.
#include int main() { int x = 100; int y = 100; ++x; ++ x; ++++x; ++ ++ x; ++--++--++--++++++--x; ++ --++-- ++--++ ++++--x; y = 1+x; // y = 1+++x; y = 1+ ++x; // y = 1+++--++--++--++++++--x; y = 1 + ++--++--++--++++++--x; x++; x ++; // x++++; //x ++ ++; // x++--++--++--++++++--; // x++ --++-- ++--++ ++++--; y = x+1; y = x+++1; y = x++ +1; // y = x+++--++--++--++++++--1; // y = x + ++--++--++--++++++--1; return 0; } |
Zakomentowane linie to te, które wypluwają błąd przy kompilacji: error: lvalue required as increment operand lub error: lvalue required as decrement operand.
To, że ignorowane są białe znaki jest sprawą dość oczywistą i łatwą do odgadnięcia. Bardziej zaskakuje fakt, w jaki sposób traktowane są złożenia kilku operatorów przy post oraz pre inkrementacji (analogicznie dekrementacji). Warto zwrócić również uwagę na to, w jaki sposób traktowany jest napis x+++1; a w jaki 1+++x;.
Nie pozostaje mi nic innego jak zachęcić do własnych eksperymentów.