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# :)
Na Elektronice, na wykładach z C++ prof Kotowski dawał całą masę tego typu smaczków :) Niestety żadnego teraz nie pamiętam ;)
OdpowiedzUsuńZ ciekawości sprawdziłem na linuchu, że przy kompilacji g++ kod:
OdpowiedzUsuńint i = 5;
i = i++;
cout<<i<<endl;
daje wynik 6. To znaczy, że zmienna jest najpierw inkrementowana a później przypisana.
dobrze wiedzieć:)
OdpowiedzUsuńEj, ale jak niby
OdpowiedzUsuńi = ++i;
może być czytelniejsze? no daj spokój :)
też się dziwiliśmy :) dla niektórych to czytelniej jak widzą znak "=". Przynajmniej wiedzą, co się dzieję :D
OdpowiedzUsuńCasino - JtmHub
OdpowiedzUsuń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 공주 출장샵