Zmiana indeksu tablicy - niepoprawne wyniki

0

Witam,
mam pytanie dlaczego po usunięciu komentarza w następującym kodzie:

cout << "b[i]: " << b[i];// << " b[++i]: " << b[++i] << endl;

wyskakuje inny wynik dla b[i]?!?
Natomiast po zmianie b[++i] na b[i+1] wszystko działa poprawnie?
Analogicznie jest w przypadku wykonywania działań tj.
(b[i] - '0') * 10 + (b[i+1] - '0'); != (b[i] - '0') * 10 + (b[++i] - '0')

Czy może mi ktoś wytłumaczyć gdzie tkwi błąd?
Przecież w tym wypadku ++i powinno być dokładnie tym samym czym i+1!!!

3

To co robisz to wywołuje unspecified behaviour (jednak UB¹), czyli zachowanie w którym konkretna implementacja ma pewną dowolność​ w rozumieniu kodu. Kolejność ewaluacji argumentów w C i C++ nie jest ustalona w C++ więc mając b[i] i b[++i] nie wiadomo czy pierwsze zostanie wykonane ++i czy i.

¹ http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points

1

i + 1 nie zmienia wartości i, a ++i jak najbardziej, więc na pewno to nie jest to samo.

Z tego co pamiętam, w takim ciągu

cout << "b[i]: " << b[i] << " b[++i]: " << b[++i] << endl;

kolejność obliczania parametrów jest niezdefiniowana, więc równie dobrze najpierw może się obliczać b[++i], a dopiero potem b[i], a wtedy i już ma nową wartość.

0

Dziękuję bardzo za wyjaśnienie!!! Faktycznie macie rację! Obliczenia rzeczywiście mogą się wykonywać od prawa do lewa i tu jest pies pogrzebany... ;-)
Dobrze, że szybko wykryłem tego bug-a ;P Ale trochę się nad tym głowiłem... ;)
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1