

Programátorská hádanka.
Nazdar,
dokážete z hlavy vypočítat hodnotu x, po provedení následujícího kódu:
int x = 10;
x += ++x + x++;
Nazdar,
dokážete z hlavy vypočítat hodnotu x, po provedení následujícího kódu:
int x = 10;
x += ++x + x++;
Zpět do poradny Odpovědět na původní otázku Nahoru
Chachá, dokážu
toto sú situácie, kedy si hovorím že by som sa mal venovať iným veciam než počítačom :(
Až budeš řešit tisíci řádkové kódy, tak tě ty hádanky přejdou
A ty jsi spolu-IP-majitel/ka nebo Helenka MaSová?
Co to?
No že z IP adresy 212.47.22.xxx je cca. 5 stránek příspěvků od tebe, tak nevim.
Stejný provider, jako máme v robotě. Doufám, že to není nějaký kolega...
EDIT: Ta IP sedí úplně?
Jo, sedí přesně, jen jsem ji nechtěl vytrubovat celou do světa.
Ehm. Ty mě snad znáš? Já se programováním živím. A ty?
Něchť a aj ať žije přehlednost kódu.
V akom jazyku?
Ak sa nemylim, C a C++ nema v tomto pripade presne definovany vysledok.
Bude rozřešení?
keby niekto napisal taky kod v realite do realneho SW tak by som ho poslal rovno na psychiatricke vysetrenie.
Vysledok asi moze zavisiet od compilera, myslim ale ze to bude 34 (alebo 33 ak to compiler parsuje zprava), ale moze byt iny je to dost nejednoznacny kod.
kedze sa pracuje s jednou premennou x tak je to jedno, kedze sa nakoniec vykonaju vsetky operacie nad touto premennou. scitaju su x+x a potom sa to este pripocita k povodnemu x a nakoniec 2x sa urobi inkrementacia o 1. Je jedno v akom poradi. Vysledok je vzdy rovnaky 32.
Inak keby si tam zakomponoval inu premennu, tak by to bolo tazsie:
Nebolo, to je to isté...
jj, sekol som sa...a = 0;
i ked aj tak to nemusi byt to iste ak sa to posledne x++ vykona az po priradeni do premennej a.
Nemas pravdu, neni to jedno pretoze ++x znamena ze sa to ma urobit pred vsetkymi ostatnymi operaciami a teda vsetky ostatne operacie by mali pouzit 11 a nie 10 (takze 11+=11+11+1=34 alebo 10+=11+11+1=33). A otazka je jak to compiler pochopi. Evidentne kazdy kompiler to pochopi inac, preto by take nieco v realite pouzil len magor. P.S. a compiler ktory da v tomto pripade vysledok 32 povazujem ja osobne za zly compiler, ptz nerespektuje ++x :D)
Ked urobim
x=10;
y= ++x;
tak y by malo byt 11.
x=10;
y= x++;
tak y by malo byt 10.
Aspon tak to chapem ja, mozno to je zadefinovane v ANSI inac ale to by potom operacia ++x nemala ziaden zmysel keby to bolo stejne jak x++ a vobec by ju nemuseli definovat. A ze ++x neni to iste co x++ je kazdemu snad jasne.
v tomto sa zhodneme, ale nezhodnem sa asi v tom, ze kompilator, ktory da vysledok 32 je zly. Zle je len pouzitie, kedze takymto nejednoznacnym zapisom by sa mal kazdy vyhnut.
Dal som tam smajl :)
Ano mozne spravne vysledky su 32, 33, a 34. Cokolvek z toho compiler urobi je svojim sposobom spravne.
...jednoznacny vysledok by to davalo lebn vtedy keby bolo niekde jasne zadefinovane ze premenne vstupujuce do vzorca sa musia povinne bufferovat, t.j.
x += ++x + x++
by potom vyzeralo takto
buffer = x
x = x+1 //toto je ++x
x = buffer + (buffer+1) + buffer
x = x+1 //toto je x++
potom by vysledok bol jednoznacne definovany, presne 32. Ale ci to je takto v ANSI zadefinovane to zhlavy neviem, a pochybujem o tom ze to tam je (nedavalo by to moc zmysel ptz by to ciastocne negovalo efekt ++x)
Java 1.6.0_22, Eclipse 3.6
Vypisuje 32.
PHP 5.3.0
vysledek je 34
To říká php, ne tvá hlava :)
já měl za to, že
++$a bude 11 (páč $a je zatím 10 a inkrementuje se o jedno)
+ $a++ (zde se $a++ [tedy momentálně 11] inkrementuje zase o jedno, takže je 12)
ve výsledku tedy $a += 11 + 12 , což znamená 10 += 23.. takže 33
Píšu to sem, aby mi kdyžtak někdo osvětlil, kde v mém uvažování je chyba ;)
PS:: už to vidím.. jelikož se inkrementovalo $a dvakrát..takže 34 je správně a php má bod .)
C#