Wrz
26

Słów kilka o [in/de]krementacji

autor: p____h  //  ::easy::, Programowanie

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.

  

Dodaj komentarz

*

Audio-CAPTCHA