[ casperns2 @ 22.03.2014. 15:41 ] @
Code:
public class Test
{
public static void main(String ar[])
{
int a=2;
a=a++;
a=a++;
System.out.println(a);
}
}



Sta se dobija za izlaz?
Ovo sam video na internetu... vodi se diskusija sta se dobija na izlazu, sta vi mislite...

[Ovu poruku je menjao casperns2 dana 22.03.2014. u 21:01 GMT+1]
[ Rapaic Rajko @ 22.03.2014. 16:16 ] @
Bogami zanimljivo...

Nisam hteo da probam u javi, ali jesam se podsetio prioriteta operatora. I, zbunilo me: mislio sam da ce se prvo izvrsiti dodeljivanje a = a, pa tek onda increment a (a++). Medjutim, NE - operator '++' ima veci prioritet od operatora '='. Ali i u jednom i u drugom slucaju, meni se cini logicnim da ce 'a' izaci na vrednost 4. Gresim li?

Pozz
[ Rapaic Rajko @ 22.03.2014. 16:20 ] @
Ili je ceo stos u ovome

Code:
public static void main(String ar[])


To nije dobro, ispravno je

Code:
public static void main(String[] ar)


Daklem..?

Pozz
[ casperns2 @ 22.03.2014. 16:32 ] @
Pa iskreno ne znam, nisam strucnjak ali meni je logicno da je 4 . Cak i na internetu gde se diskutuje ima dosta razlicitih misljenja pa ni sam ne znam sta je tacno.... ali meni je logicno da ce na kraju na izlazu "a" biti 4 ... zato sam i postavio ovde da vidim jel zaista to izlaz...
[ jablan @ 22.03.2014. 19:38 ] @
Pa jel nije bilo jednostavnije da probaš?

http://ideone.com/OA02wm

ps koristi [code] tagove kad kačiš kod.
[ Burgos @ 22.03.2014. 19:54 ] @
Rešenje je 2, kao što je jablan pokazao. Operator postinkrementa povećava vrednost operanda za 1, ali vraća njegovu staru vrednost. 4 će se ispisati ako se upotrebi operator preinkrementiranja koji će vratiti inkrementiranu vrednost:

Code:
public class Test
{
public static void main(String[] ar)
{
    int a=2;
    a=++a;
    a=++a;
    System.out.println(a);
}
}
[ casperns2 @ 22.03.2014. 19:58 ] @
Probao sam odmah i dobio sam dva, stim sto mi nije jasno kako a i znatizeljan sam da znam zasto 2 a ne 4 .

Rekao sam da je meni ovo izgledalo da je 4 , pre nego sto sam pustio da masina izracuna. Mada necu razbijati glavu oko ovoga ali skroz mi je interesantno... :)

[ Burgos @ 22.03.2014. 20:06 ] @
Neka je a = 1, b = 0;

Nakon b = a++;

b = 1 (stara vrednost od a), a = 2 (inkrementirana vrednost a0)
[ casperns2 @ 22.03.2014. 20:44 ] @
ali ako dodas jos jedno
b=a++

onda ce b primiti vrednost od a uvecanu za +1 iz prvog reda

b=0 , a=1

b=a++ // b=1 a=2
b=a++ //b=2 a=3
[ jablan @ 23.03.2014. 11:38 ] @
Dakle:

Code:
a = a++


radi sledeće korake:

1) računa izraz sa desne strane (rezultat je 2)
2) izvršava inkrementiranje (a dobija vrednost 3)
3) izvršava dodelu (a opet dobija vrednost 2)

kvaka je dakle u tome što se inkrementiranje dešava nakon računanja izraza, a pre dodele.

(inače, još jedan dokaz da su bez potrebe prekomplikovali Javu)

ps koristi code tagove
[ blekmor @ 23.03.2014. 23:56 ] @
Operator ++ je višeg prioriteta nego = (operator dodjele). Kada znaš ovo, sasvim je jasno da će vrijednost promeljive a na kraju ostati nepromjenjena. Evo objašnjenja

Code:
a=a++

kako je operator ++ prioritetniji od operatora dodjele, on će prvi i da se izvrši. Znači prvo se izvršava
Code:
a++

operator ++ će da uveća vrijednost promeljive za 1, ali će da vrati staru vrijednost(tako je definisan).
Operator dodjele će promeljivoj sa lijeve strane(a) da dodjeli vrijednost izraza sa desne strane(a++). Kako je vrijednost izraza sa desne strane 2 (operator ++ je vratio 2, staru vrijednost, bez obzira što ju je u medjuvremenu uvećao za 1), u promeljivu a upisujemo tu vrijednost, te je a opet = 2.

Primjer je baš vještački, ali se iz njega mogu naučiti neke stvari.

Inače, operator dodjele je operator najnižeg prioriteta. To ti na prvu loptu možda izgleda neobično (ipak je dodjela jako važna, mnogo važnija od ++) ali prioritet operatora nema veze sa tim šta je "važno" ili šta se češće koristi. Prioritet operatora je tako postavljen kako bi programi bili čitljiviji, jasniji i lakši za kompajliranje(to je već posebna priča). Ukoliko bi operator dodjele imao viši prioritet od nekog drugog operatora (npr operatora +), onda izraz
Code:
b=c+d

ne bi imao smisla, nego bi morali pisati
Code:
b=(c+d)

što je glupo.

Citat:
jablan:
(inače, još jedan dokaz da su bez potrebe prekomplikovali Javu)

Odužio sam ovo objašnjenje kako bih skrenuo pažnju @jablan da je ponašanje Jave u ovom slučaju tačno po definiciji i intuiciji(naravno, programerskoj intuiciji).

@casperns2
Da li ti je sada ovo jasnije? Da li ti je jasno zašto bi rezultat na kraju bio 4, ukoliko bi umjesto
Code:
a=a++

koristili
Code:
a=++a

?

pozdrav
[ casperns2 @ 24.03.2014. 08:39 ] @
Sada su razresene sve dileme, hvala svima na odgovorima, idem da borim sa javinim GUI...
[ jablan @ 24.03.2014. 10:57 ] @
Citat:
blekmor:
Odužio sam ovo objašnjenje kako bih skrenuo pažnju @jablan da je ponašanje Jave u ovom slučaju tačno po definiciji i intuiciji(naravno, programerskoj intuiciji).

Hm, pa upravo ovaj thread je dokaz da ponašanje NIJE intuitivno. A sve zato što su slepo preuzeli taj operator od C++, i pored toga što je jedini operator sa side-efektom (zapravo, kod sufiksnog oblika samo taj side-efekat i postoji). A čemu sve to? Samo da bi se uštedeo jedan karakter, u jeziku koji se inače baš i ne može pohvaliti sažetošću.
[ blekmor @ 24.03.2014. 12:06 ] @
Citat:
jablan: Hm, pa upravo ovaj thread je dokaz da ponašanje NIJE intuitivno. A sve zato što su slepo preuzeli taj operator od C++, i pored toga što je jedini operator sa side-efektom (zapravo, kod sufiksnog oblika samo taj side-efekat i postoji). A čemu sve to? Samo da bi se uštedeo jedan karakter, u jeziku koji se inače baš i ne može pohvaliti sažetošću.


Tačno, možda nije baš intuitivno ponašanje operatora ++ u ovom primjeru.
Taj operator uopšte nije neophodan, niti ga Java forsira u bilo kom smislu.
Po meni je sasvim korektna ušteda u konstrukciji tipa
Code:
a = b++


Primjer iz ovog threada je besmislen, te je bezveze "hejtovati" Javu na osnovu njega. Bogu hvala, Java ima mnogo drugih stvari na osnovu kojih se može "hejtovati", ali operator ++ nije jedna od njih.

pozdrav



[ jablan @ 24.03.2014. 12:16 ] @
Dozvolićeš da imam drugačije mišljenje (i nisam usamljen u tome) - operatorima sa side-efektima nije mesto u Javi, niti u bilo kojem jeziku višeg nivoa. ++ ima smisla u C-u gde se manje više dobro mapira na mašinske instrukcije inkrementiranja, kao i na rad sa pointerima. U Javi nema puno smisla, ne donosi gotovo ništa, a komplikuje učenje i povećava mogućnost previđanja greške. Mogu čak reći da je najveći smisao ++ u Javi iživljavanje na intervjuima za posao. :)
[ blekmor @ 24.03.2014. 12:43 ] @
Bez operatora ++, for petlje bi ružno izgledale.:)

Šalu na stranu, apsolutno bih dijelio tvoje mišljenje ukoliko bi Java bila čisto objetni jezik. No kako su je već napravili kombinacijom svega i svačega, neka ga i operator ++, meni ne smeta.

pozdrav
[ jablan @ 24.03.2014. 13:09 ] @
Citat:
blekmor: Bez operatora ++, for petlje bi ružno izgledale.:)

Kad smo kod toga, da ne bude da samo pljujem, for-each petlje u Javi su dobra stvar (šteta samo što je autorima Jave trebalo 10 godina da ih se sete). U 90% slučajeva, for ionako služi za iteraciju kroz neku kolekciju.

[Ovu poruku je menjao jablan dana 24.03.2014. u 14:24 GMT+1]
[ Burgos @ 25.03.2014. 10:26 ] @
A evo potvrde i od gosn. Eric Lipperta:

Citat:
Lots of good answers here so I won't re-state what others have already said, except to emphasize that these operators are horrid features. They're very confusing; after over 25 years I still get pre- and post- semantics mixed up. They encourage bad habits like combining evaluation of results with production of side effects. Had these features not been in C/C++/Java/JavaScript/etc, they would not have been invented for C#.
[ jablan @ 25.03.2014. 11:33 ] @
Hehe pa što ne okačiš link:

http://programmers.stackexchan...ncrement-operator-in-java-or-c

Odličan thread, hvala!
[ Burgos @ 25.03.2014. 11:34 ] @
Kontao sam da ćete proguglati :D. Šalim se - zaboravio sam!