Strona 1 z 1

[C][C++] Inkrementacja i jej zachowanie

: 27 sty 2018, o 21:01
autor: reyg
Mam problem ze zrozumienie, dlaczego kompilator w przypadkach poniżej wypisuje takie wyniki.
Nie widzę za bardzo co dzieje się po kolei. mógłby mi ktoś to wytłumaczyć. Tak jakoś łopatologicznie?

Kod: Zaznacz cały

int a=5; 
int b=a++*a++; 
cout<<b<<" "<<a;
return 0;
Wypisuje: 30 i 7.

Kod: Zaznacz cały

int a=5; 
int b=++a*++a;
cout<<b<<" "<<a;
return 0;
Tu wypisuje 49 i 7.

Kod: Zaznacz cały

int a=5;
int b=a++*++a; 
cout<<b<<" "<<a;
return 0;
Tutaj 35 i 7.

Kod: Zaznacz cały

int a=5; 
int b=++a*a++; 
cout<<b<<" "<<a;
return 0;
Tutaj 42 i 7.

Wiem że a++ i ++a, to różne rzeczy, ale nie widzę tego w praktyce w powyższych kodach.
Np. a=5 i b=a++ to b=5 (i następnie a=6).
W przypadku a=5 i b=++a to od razu b=6 i a=6, tak?

[C][C++] Inkrementacja i jej zachowanie

: 28 sty 2018, o 12:29
autor: miki999
No to od początku:

Kod: Zaznacz cały

int a=5;
int b=a++*a++;
Wartość a na początku to \(\displaystyle{ 5}\) . a++ mówi "weź wartość a i zwiększ ją o \(\displaystyle{ 1}\)", zatem mamy:

Kod: Zaznacz cały

b = 5 * a++;  // a = 6 
Potem zwróć uwagę na kolejność operatorów ( ... precedence) ++ jest przed *, więc znowu bierzemy wartość a , która po poprzedniej operacji wynosi \(\displaystyle{ 6}\) i ją inkrementujemy. Czyli mamy:

Kod: Zaznacz cały

b = 5 * 6  // a = 7
Pozostałe przykłady analogicznie, tyle że jak ++ jest z przodu, to najpierw inkrementujesz, a potem bierzesz.

Oczywiście taki kod jest bardzo nieczytelny.

[C][C++] Inkrementacja i jej zachowanie

: 28 sty 2018, o 13:42
autor: reyg
Dzięki. W miarę mi się to jakoś poukładało.

Re: [C][C++] Inkrementacja i jej zachowanie

: 29 sty 2018, o 03:34
autor: Afish
W C++ taka operacja powoduje niezdefiniowane zachowanie, więc jakiekolwiek analizy są umiarkowanie wiarygodne.