Zmiana indeksu tablicy - niepoprawne wyniki

Odpowiedz Nowy wątek
2014-12-17 16:12
Krzywy Samiec
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!!!

Pozostało 580 znaków

2014-12-17 16:18
kq

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/ques[...]-behavior-and-sequence-points


edytowany 2x, ostatnio: kq, 2014-12-17 16:35

Pozostało 580 znaków

2014-12-17 16:19
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ść.

Pozostało 580 znaków

2014-12-17 16:24
Krzywy Samiec
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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