Használd ezt az oldalt. Nagyon szépen le vannak írva a szabályok az egyes szabványoknak megfelelően. Más témakörökben is érdemes lehet felcsapni, bár önmagában itt ott túl tömény, de referenciának tökéletes!
Nem adja meg a jó választ. Csak annyit hogy jó vagy rossz a válasz. Ráadásul nem is lehet rögzíteni vagy fényképet csinálni a kijelzőről hogy át tudjam rágni magam rajta.
Nálam a codeblockba beírva hozta ezt az eredményt.
Ezek szerint ez egy szép példa arra hogy mennyire szabad feszegetni a tömörítés határait. Tisztán egyszerűen kell leírni hogy mit mennyivel akarok módosítani.
Klassz.
Mondjuk azt nem tudom, hogy egy ingyenes tananyagban miért kell az ilyesmit erőltetni. A BME-n még elmegy péniszméricskélésnek, de gyakorlati haszna nem sok van.
Sequence-point operation on ‘i’ may be undefined hibát dob.
--[ megj: C fejlesztés alatt én alapból használom a -Wall -Wextra -Werror opciókat.
--[ a C++ meg olyan mostoha gyerek nálam :) Jó, jó, van, de nem édesgyermek.
Hoppácska!!!
A fenti kódom csak akkor igaz, ha az i változót globálisnak definiálom.
Ha lokálisan ott van a kiíratás előtt, ahogy a kérdezőnél, akkor a fordító kigyomlálja az egészet és csak az eredményt nyomja, logikusan. De nem 8-at, mint a globális számolásnál, hanem 9-et!!!
Vagyis még saját magával se kompatibilis a fordító a környezettől függően. Ez az igazi UB!!!
az első ++i művelet után az i = 4
a második i++ művelet után az i = 5 és összeadva az i = 9
Ez logikus lenne, de az i++ értéke nem lehet 5, hanem csak 4. A számolási sorrendtől függően 4 + 4 vagy 5 + 3 a behelyettesítés. Vagy akár 4 + 3. (ha nem írja vissza az i++ -t azonnal)
Ezek szerint ha más-más fordítóval készül a kód az eredmény is lehet különböző.
Ebben az esetben nem szerencsés hogy egy oktató programban szerepel ilyen kérdés. :(
A fordítóprogram tudtommal nem köteles balról jobbra végrehajtani a felcserélhető operandusokat. Mivel matematikailag a+b egyenértékű b+a, ezért lehet, hogy az i+(i++) utasításból (i++)+i lesz.
szerk. utánanéztem, pontosítok. Az összeadás balról jobbra megy. De arra nincs szabály, hogy a + jel melyik oldalát kell előbb kiértékelni. Ezért az ilyen képleteket zárójelezni kell az egyértelműség miatt.
szerk2. még ráadásul az is szabály, hogy a post-increment (hátulra írt ++) "mellékhatását", azaz hogy ez a változó értékét módosítja, nem köteles a fordító rögtön végrehajtani, elég kiszámolni az emelt értéket, behelyettesíteni a képletbe, és majd valamikor beírja az értéket. A pre-increment ++i formánál épp fordítva van: előbb változót növelünk, utána lehet kiértékelni.