Novo

Forum kao aplikacija na telefonu

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

  • 14 odgovora
  • 6.365 pregleda

Najnovija ↓

cudano ponasanje koda 20.11.2006. u 16:10 · pre 242 meseca #1
Dev c++
kod:
#include <stdio.h>
main()
{
int i = 5;
printf("%d %d", i, i++);
}

ispis: 6 5

Molim komentar
Re: cudano ponasanje koda 20.11.2006. u 16:28 · pre 242 meseca #2
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

Re: cudano ponasanje koda 20.11.2006. u 17:55 · pre 242 meseca #3
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...
Potpis
Expert Opinions - Niche Articles
Re: Čudno ponašanje koda 20.11.2006. u 19:15 · pre 242 meseca #4
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)
Potpis
I ♥ ♀

Ovaj post je zlata vrijedan!
Re: cudano ponasanje koda 20.11.2006. u 19:50 · pre 242 meseca #5
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
}



Re: cudano ponasanje koda 20.11.2006. u 20:06 · pre 242 meseca #6
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;
}

Re: cudano ponasanje koda 20.11.2006. u 20:08 · pre 242 meseca #7
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!
Potpis
[email protected]
Re: cudano ponasanje koda 20.11.2006. u 21:43 · pre 242 meseca #10
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...:))
Potpis
"nice town, i'll take it..."
Re: cudano ponasanje koda 20.11.2006. u 22:13 · pre 242 meseca #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.

Re: cudano ponasanje koda 20.11.2006. u 23:58 · pre 242 meseca #14
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.
Potpis
OV SM
LA PK
Re: cudano ponasanje koda 21.11.2006. u 17:44 · pre 242 meseca #15
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).
Potpis
Put the funk in funktion.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme