środa, 20 października 2010

i = i++;

Ostatnio słyszałem historię o osobie, która zamiast preinkrementować zmienną w sposób tradycyjny czyli pisząc komendę:
++i;
używała do tego celu wyrażenia:
i = ++i;
bo podobno tak jest czytelniej. O ile takie wyrażenie powoduje tylko spadek wydajności (dodatkowe niepotrzebne przypisanie) oraz utratę czytelności (nie uważam, żeby to było czytelne), to wyrażenie:
i = i++;
może wprowadzić do projektu mnóstwo zamętu.

Okazuje się, że wynik takiego wyrażenia jest zaskakujący. W języku Java instrukcja:
i = i++;
spowoduje zwiększenie zmiennej i o 1, po czy stara wartość tej zmiennej (czyli wartość sprzed inkrementacji) jest przypisywana do zmiennej i. Czyli instrukcja ta nie zmodyfikuje w żaden sposób zmiennej i (zainteresowanych odsyłam tutaj). To by było na tyle, jeśli chodzi o Jave.

Teraz pora przyjrzeć się tejże instrukcji, zapisanej w języku C++. Okazuje się, że wynik działania programu jest zależny od kompilatora.

Efektem wywołania tej instrukcji, skompilowanej w środowisku M$ Visual Studio 2008 jest zwiększenie zmiennej i o 1. Natomiast ten sam kod, skompilowany za pomocą Dev-C++ 4.9, zachowuje się tak samo, jak to miało miejsce w języku Java, czyli nie powoduje zmiany wartości zmiennej i. Ten sam kod, skompilowany za pomocą g++ 4.1.2 wyświetla ostrzeżenie o treści: "operation on 'i' may be undefined". Jaki jest efekt uruchomienia tak skompilowanego programu? Tego nie wiem, gdyż korzystałem z kompilatora ze strony http://codepad.org (swoją drogą fajna stronka),a on nie uruchamia programu z ostrzeżeniami.

Zastanawia mnie tylko, jaki byłby wynik skompilowania instrukcji i=i++ w języku J# :)

6 komentarzy:

  1. Na Elektronice, na wykładach z C++ prof Kotowski dawał całą masę tego typu smaczków :) Niestety żadnego teraz nie pamiętam ;)

    OdpowiedzUsuń
  2. Z ciekawości sprawdziłem na linuchu, że przy kompilacji g++ kod:

    int i = 5;
    i = i++;
    cout<<i<<endl;

    daje wynik 6. To znaczy, że zmienna jest najpierw inkrementowana a później przypisana.

    OdpowiedzUsuń
  3. Ej, ale jak niby
    i = ++i;
    może być czytelniejsze? no daj spokój :)

    OdpowiedzUsuń
  4. też się dziwiliśmy :) dla niektórych to czytelniej jak widzą znak "=". Przynajmniej wiedzą, co się dzieję :D

    OdpowiedzUsuń
  5. Casino - JtmHub
    Casino. New Slots. All the latest 하남 출장샵 & hottest casino games 이천 출장샵 and slot machines, featuring the latest and greatest slots games from the 정읍 출장안마 best developer,  Rating: 강릉 출장안마 5 · ‎1 vote 공주 출장샵

    OdpowiedzUsuń