Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 19 odgovora
  • 4.522 pregleda

Najnovija ↓

Koji rezultat je na izlazu? 22.03.2014. u 16:41 · pre 153 meseca
izmenjeno 1 put, poslednji put casperns2 22.03.2014. u 21:01
  1. casperns222.03.2014. u 21:01zapis iz teksta poruke
#1
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...
Re: Koji rezultat je na izlazu? 22.03.2014. u 17:16 · pre 153 meseca #2
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
Re: Koji rezultat je na izlazu? 22.03.2014. u 17:20 · pre 153 meseca #3
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
Re: Koji rezultat je na izlazu? 22.03.2014. u 17:32 · pre 153 meseca #4
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...
Re: Koji rezultat je na izlazu? 22.03.2014. u 20:54 · pre 153 meseca #6
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);
}
}
Re: Koji rezultat je na izlazu? 22.03.2014. u 20:58 · pre 153 meseca #7
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... :)

Re: Koji rezultat je na izlazu? 22.03.2014. u 21:44 · pre 153 meseca #9
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
Re: Koji rezultat je na izlazu? 23.03.2014. u 12:38 · pre 153 meseca #10
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
Re: Koji rezultat je na izlazu? 24.03.2014. u 00:56 · pre 153 meseca #11
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
Sviđa mi se1
Re: Koji rezultat je na izlazu? 24.03.2014. u 09:39 · pre 153 meseca #12
Sada su razresene sve dileme, hvala svima na odgovorima, idem da borim sa javinim GUI...
Re: Koji rezultat je na izlazu? 24.03.2014. u 11:57 · pre 153 meseca #13
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.
Re: Koji rezultat je na izlazu? 24.03.2014. u 13:06 · pre 153 meseca #14
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



Re: Koji rezultat je na izlazu? 24.03.2014. u 13:16 · pre 153 meseca #15
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. :)
Re: Koji rezultat je na izlazu? 24.03.2014. u 13:43 · pre 153 meseca #16
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
Re: Koji rezultat je na izlazu? 24.03.2014. u 14:09 · pre 153 meseca
izmenjeno 1 put, poslednji put jablan 24.03.2014. u 14:24
  1. jablan24.03.2014. u 14:24zapis iz teksta poruke
#17
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.
Re: Koji rezultat je na izlazu? 25.03.2014. u 11:26 · pre 153 meseca #18
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#.
Sviđa mi se1
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme