Instrukcja +=++

0

Hej!

Jaka będzie wartość zmiennej b i jak dokładnie będzie wyglądał przebieg wyliczania jej wartości?

Kod jest w języku C.

 (...)
int a = 5, b = 3;

b +=++ a;
9

b += ++a; spróbuj w takiej formie to zrozumieć.

3

btw. Takie zadania sa bezsensu. Ok rozumiemy jak dziala kompilator, ale nigdy. Przenigdy nie widzialem czegos takiego w kodzie.

0

najpierw operator pre-incrementacji - zwiększa wartość zmiennej o 1 a następnie pobiera jej wartość
potem wartość zmiennej b jest zwiększana o nową wartość zmiennej a
wynik 9 ....

... a jeżeli bawimy się w zagadki to kto ładnie opisze tą:

x = (x + y) - (y = x);

0

o, patrzcie:
a --> b
:D

0

Przy tego typu zadaniach polecam zapoznać się z* operator precedence* http://en.cppreference.com/w/c/language/operator_precedence

0

ponieważ nikt nie spieszy się z ŁADNYM wyjaśnieniem - to napiszę:

przyjmując że y=2 a x = 1 mamy:

krok pierwszy (wyliczamy wartosć lewego nawiasu): 3
krok drugi (wyliczamy wartosć prawego nawiasu): 1 oraz x = 1, y = 1, bo y = x,
krok trzeci - odejmowanie: x = 3 -1 wiec, x = 2
mamy wiec y = 1, x = 2
wartości zmiennych zostały więc zamienione
oczywiście jest to ciekawostka bez praktycznego znaczenia (podobnie jak to pierwsze równianie)
ale przecież programowanie to nie tylko "pisanie programów na zlecenie" ale również takie smaczki przy których można się czasem uśmiechnąć ...

0

@barpas: UB jest wtedy, kiedy standard języka nie definiuje jak ma być wykonana instrukcja. Przy a = f(x) - g(x) standard nie mówi, która z funkcji (f czy g) zostanie wykonana pierwsza - w tym problem. Ponadto - każdy kompilator może sobie zrobić z tym co chce - idea UB jednak mówi, że błąd może wylecieć 100 linijek dalej w prostej inkrementacji zmiennej - może stać się wszystko. I już.

0

tyle teorii, i w teorii oczywiście masz rację - tyle że w praktyce współczesne kompilatory układają operacje równoważne w stos i zdejmują po kolei - dlatego, choć w opisie przeczytasz że nie ma takiej zasady to jednak zawsze wykonywane jest to od lewej, (a przynajmniej nigdy nie widziałem żeby było inaczej)

3

@barpas

Nie, to nie jest teoria to rowniez jest praktyka. To ze dziala teraz nie znaczy ze przy innych flagach kompilatora (np z wlaczona optymalizacja) ten kod zrobi ZUPELNIE COS INNEGO

Zreszta pisanie takiego kodu jak juz pisalem to jest WTF. Nikt takiego kodu w produkcji nie pisze, wiec gdybanie "co bedzie na wyjsciu" to bym powiedzial "ten kod bedzie na wyjsciu z produkcji"

To jest UB i tyle. Nie da sie przewidziec tego zachowania, to znaczy ze dziala na 3 kompilatorach dzis, to nadal nie jest gwarancja.

Zrobie porownanie. Ja wyciagam usb od razu (bez bezpiecznego wyciagania) jakos USB zadne mi sie nie popsuly. Znam osoby ktore tez tak robily do czasu gdy USB sie popsulo.

Widzisz? Dla mnie dziala, ale dla kogos innego nie zadzialalo i sie rozwalilo wszystko. Tu jest podobnie

0

nie no ok, i przykład z usb jest jak najbardziej trafiony
zresztą nie twierdziłem nigdy że to wyrażenie ma sens praktyczny - pisząc program nikt przy zdrowych zmysłach go nie użyje choćby z powodu nieczytelności - pisałem że to ciekawostka, że i jak działa i tyle w temacie który proponował bym już zakończyć

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