[ mosho @ 20.11.2006. 15:10 ] @
Dev c++ kod: #include <stdio.h> main() { int i = 5; printf("%d %d", i, i++); } ispis: 6 5 Molim komentar |
[ mosho @ 20.11.2006. 15:10 ] @
[ X Files @ 20.11.2006. 15:28 ] @
Code: printf("%d %d", i, i++); Dakle, obrada ide s desna da levo, pa: Code: i++ Ostaje 5 za zamenu sa pripadajućim %d (jer je "++" iza "i"), a uvećava se za jedan za sledeću upotrebu, tj.za: Code: i Probaj: Code: printf("%d %d", i, ++i); ili Code: printf("%d %d", i, i+=1); ... mislim da bi trebalo da bude: 6 6 [ toxi_programer @ 20.11.2006. 16:55 ] @
NjET!!!
DevC++ nisam koristio ali rezultat koji treba da se ispise je "5 5". Koristio si postfiksnu notaciju u gornjem primeru sto znaci da se vrednost promenljive uvecava tek po zavrsetku tekuce naredbe, tako da nema veze kojim ga redosledom pisali. Stavi: printf("%d %d", i++, i); rezultat MORA i dalje da bude "5 5". Ako nije onda nesto nije OK sa kompajlerom... [ icobh @ 20.11.2006. 18:15 ] @
GCC pravi takve probleme, jer kako sam skontao, a dosta toga sam iskompajlirao sa njim, ima problema sa memory managment-om. Uglavnom se problem rješava resetovanjem kompa...
P.S. Trenutno koristim 3.4.5 verziju i nije mi se ovo događalo, dok sa 3.4.2 verzijom jeste (onaj koji dolazi sa Dev C++ 4.9.9.2) [ X Files @ 20.11.2006. 18:50 ] @
Evo, sada sam i probao. Borland C++ Builder 6 takodje daje rezultat (6 5), kao kod DevCc++:
Code: #include <stdio.h> main() { int i = 5; printf("%d %d", i, i++); // < --- 6 5 // printf("%d %d", i, ++i ); // < --- 6 6 // printf("%d %d", i++, i); // < --- 5 5 // printf("%d %d", ++i, i ); // < --- 6 5 } [ X Files @ 20.11.2006. 19:06 ] @
BCB & MS VC++2005 Express
Code: #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { int i = 5; printf("%d %d", i, i++); // < --- BCB: 6 5 --- MS VC++2005 Express: 5 5 //printf("%d %d", i, ++i ); // < --- BCB: 6 6 --- MS VC++2005 Express: 6 6 //printf("%d %d", i++, i); // < --- BCB: 5 5 --- MS VC++2005 Express: 5 5 //printf("%d %d", ++i, i ); // < --- BCB: 6 5 --- MS VC++2005 Express: 6 6 return 0; } [ Buffy @ 20.11.2006. 19:08 ] @
u pravu je x-files.
Parametri funkcija se izvrsavaju s desna na lijevo, tako da ce se prvo izvrsiti i++, pa onda i. Tekuca naredba je i++, a ne citava printf funkcija. Pozdrav! [ X Files @ 20.11.2006. 20:05 ] @
Ja pitah na Borland-ovim forumima i tamo rekose da se radi o nedefinisanom slucaju,
pa su u tom smislu - oba resenja tacna. Kažu, Google-uj: sequence point http://www.embedded.com/shared...rticle.jhtml?articleID=9900661 [ Buffy @ 20.11.2006. 20:35 ] @
cudi da ovo nije standardizovano.
[ igac @ 20.11.2006. 20:43 ] @
takav slucaj i jeste nedefinisan... npr na elektrijadi smo pitali sta ako bude takav slucaj?
ja sam se zalagao za slucaj da se ide sa desna u lijevo jer se tako stavljaju argumenti na stack pa tom logikom ce ici sa desna u lijevo ali prof. rekli da je nedefinisano, zavisi od kompajlera i kao 100% nece tako nesto biti na takmicenju:) a i treba to izbjegavati ili mozda standard puci neki (a kao neko ce se toga drzati...:)) [ Buffy @ 20.11.2006. 21:00 ] @
ipak meni je izlaz 6, 5 najprihvatljiviji. Logicno je.
[ Dragi Tata @ 20.11.2006. 21:06 ] @
[ X Files @ 20.11.2006. 21:13 ] @
Promena opcija optimizacije kompajlera moze dovesti do predvidljivog redosleda operacija,
(ako je poenta do kompatibilnosti) ali opet, slucaj je kao sto pise Stroustrup - nedefinisan. [ caboom @ 20.11.2006. 22:58 ] @
hah :) ovo pitanje sam imao za contracting u BofA i bilo je zabavno sto osoba koja me je intervjuisala nije znala tacan odgovor. btw. ovo je nedefinisan primer koji se cesto nalazi po matorom kodu i cesto zahvaljujuci njemu izlecu "voodoo" problemi prilikom upgrade-a na novi dev environment.
[ cynique @ 21.11.2006. 16:44 ] @
Redoslijed evaluacije operanada u izrazu nikad nije definiran, i stoga nije nimalo zdravo pisati izraze u kojima jedan operand ovisi o vrijednosti drugog.
Općenito kad kompajler izgradi generativno stablo (derivation tree) prilikom interpretiranja nekog niza simbola koji predstavlja izraz programskog jezika, definirana pravila prednosti (precedence) i asocijativnosti nad operatorima određuju načine grupiranja dijelova izraza u zajedničkom podstablu (npr. zagradama) - redoslijed izvođenja operacija jest definiran, redoslijed evaluiranja listova stabla nije. Isto vrijedi i za aritmetičko-logičke izraze kao u gornjem primjeru, kao i za sve ostale - npr. ulančavanje sa <<, redoslijed evaluacije argumenata funkcije u striktnim jezicima (većina slijeva-nadesno, ali neki (OCaml) zdesna-nalijevo, valjda ovisno kako standard diktira :) i sl. Rule of thumb: jedna naredba -> jedan side-effect (dakle ne npr. naredba koja istovremeno i baca iznimku i radio I/O). Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|