Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Primer razlike medju kompajlerima...

[es] :: C/C++ programiranje :: Primer razlike medju kompajlerima...

Strane: 1 2

[ Pregleda: 5528 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

markom
Marko Milivojević
Network Engineer
Google
Mountain View

Član broj: 18427
Poruke: 4227
*.markom.info

Sajt: https://markom.rs


+16 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 21:06 - pre 248 meseci
Evo sedimo Alex i ja ovde jedan pored drugog i lomimo glavu oko ovoga.

Ovde neko nekoga u zdrav mozak, ako mene pitate.

Izraz:

Code:

a = arr[a]++;


bi po svoj zdravoj logici morao da bude ekvivalentan:
Code:

b = a;
a = arr[a];
arr[b] = arr[b]+1;


Sve drugo je, po mom mišljenju bug u kompajleru. U linku koji je drug Dimković ;-) poslao, data situacija NIJE deklarisana kao nedefinisana.

Šta VC kaže kad mu se podmetne ovaj kod?

Code:

int main()

   int arr[2] = {1, 1}; 
   int a = 0; 
   a = arr[a]++; 
   printf("a: %d\n", a);
   printf("arr[0]: %d\n", arr[0]);
   printf("arr[1]: %d\n", arr[1]);
   return 0; 
}


koji se kompajlira kao čist C?


M&A.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 21:46 - pre 248 meseci
Citat:
mdm:
Izraz:

Code:

a = arr[a]++;


bi po svoj zdravoj logici morao da bude ekvivalentan:
Code:

b = a;
a = arr[a];
arr[b] = arr[b]+1;


Sve drugo je, po mom mišljenju bug u kompajleru.


Drugovi Islanđani su u pravu sa stanovišta "zdrave logike", ali ovde ne raspravljamo šta je logično, već šta je u skladu sa C++ standardom. Koliko sam ja u stanju da vidim, VC++ postupa u skladu sa standardom jer:

1) subscript operator i postinkrement imaju podjednak prioritet
2) Redosled evaluacije podizraza unutar izraza nije definisan

Mada je to potpuno nebitno, jer bi jedino lud čovek mogao da napiše tako nešto, osim iz zezanja.
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
..-chandran.sbs.auckland.ac.nz



+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 23:25 - pre 248 meseci
Citat:
filmil:
Ovaj... a šta je onda sa referencama u kojima stoji da [] ima veći prioritet od .++? Jedan od linkova sam već dao, a ima ih dosta.

Filipe, to je tacno zbog toga sto obicne zagrade imaju prednost. arr[a]++ se prevodi kao *((arr)+(a)) pa se to u zagradama racuna pre ++ sto je i logicno. Ali tu postoji problem jer je a na dva mesta referencirano pa mislim da je zbog toga nedefinisano. (Jednom je korisceno kod dodele a jednom kod ++)

Jer ako bi
Code:
a=b++

trebalo da se prevodi u ovo:
Code:

a=b;
b++


zar ne bi trebalo onda
Code:

a=arr[a]++

da se prevodi u ovo
Code:

a=arr[a];
arr[a]++;


ako bi bilo tako onda bi znacilo da MinGW gresi mada ovde verovatno nijedan kompajler ne gresi ako je vrednost nedefinisana.
Tako ni izraz i=7; izraz=(i++)*(i++); nije definisan jer neki kompajler ce da da 49 a neki 56. Znaci to je isto kao razlika izmedju ovog gore i onoga sto je marko dao. Da li ce da se pamti ono sto se menja prilikom sledeceg koriscenja ili nece.

Imate ovde standard:
http://it-books.narod.ru
a imate i The C++ Programming Language, Third Special Edition
od Bjarne Stroustrup
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Primer razlike medju kompajlerima...12.12.2003. u 00:50 - pre 248 meseci
Iz ove diskusije izvukao sam dve pouke:

- Ako se u C ili C++ programima pojavi izraz između dva „sequence pointa“ koji sadrži sporedne efekte, i ako redosled izvršavanja sporednih efekata i operacija nije jednoznačan, onda je izraz bar nedefinisan, a možda i nelegalan.

Ako je izraz nedefinisan, bilo koji rezultat izvršenja operacije je moguć, čak recimo i to da vam u trenutku izvršenja programa na vrata pozvoni Pamela Anderson. I svaka rasprava da u tom slučaju jedan kompajler prevodi ovako, a drugi onako je besmislena zato što programi treba da sadrže samo iskaze čija je semantika jednoznačna.

- Ne verujte svemu što pročitate na internetu, a dodao bih pogotovo ako su u pitanju diskusije na popularne teme kao što je C. Svi redom kače svoje „tutorijale“ koji su ovakvi ili onakvi, ali u principu ne moraju da budu tačni.

f
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7177 Profil

icon Re: Primer razlike medju kompajlerima...12.12.2003. u 09:12 - pre 248 meseci
Citat:

- Ako se u C ili C++ programima pojavi izraz između dva „sequence pointa“ koji sadrži sporedne efekte, i ako redosled izvršavanja sporednih efekata i operacija nije jednoznačan, onda je izraz bar nedefinisan, a možda i nelegalan.


Ovaj koji smo naveli nije legalan - jer se u C++ standardu (bar u onom draftu) pominje:

Citat:

Between the previ-ous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.


Mislim da bi C++ kompajler trebao da izbaci warning koji bi autora upozorio da radi nesto sto nije definisano standardom i da moze dobiti neocekivan rezultat.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Primer razlike medju kompajlerima...12.12.2003. u 09:24 - pre 248 meseci
Citat:
Ivan Dimkovic:
Mislim da bi C++ kompajler trebao da izbaci warning koji bi autora upozorio da radi nesto sto nije definisano standardom

Očekivati tako pametno upozorenje od kompajlera čija je najčešća poruka o grešci „parse error“ je baš puno. :)
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.dialup.xtra.co.nz



+3 Profil

icon Re: Primer razlike medju kompajlerima...22.12.2003. u 17:17 - pre 248 meseci
Da malo osvezim temu.
Citat:
Dragi Tata:
Nemam ni ja standard, ali imam "Bibliju" (The C++ Programming Language 3rd edition - B. Stroustrup). Elem, najpre u odeljku 6.2 Operator summary strana 120 imate operatore poređane po prioritetu i tu se vidi da subscripting i post increment imaju isti prioritet
Ali ovde to ne vazi jer ono u zagradama mora prvo da se izracuna. To sto si procitao se odnosi na ovaj izraz:
expression++[expression2]
E tu se ne zna da li ce da se izracuna prvo expression ili expression2 sto je i logicno jer se to pretvara u *((expression++)+(expression2)).
Makar ja tako shvatam to sto si naveo ali mozda gresim.

Citat:
The order of evaluation of subexpressions within an expression is undefined. In particular, you cannot assume that the expression is evaluated left to right.


U standardu pise drugacije i pise unspecified umesto undefined sto znaci da Microsoft moze da stavi da se izracunava sleva na desno i da tako posmatras kada radis sa njihovim kompajlerom tako da nisu pogresili u dokumentaciji.
Mozes da skines standard sa onog sajta koji sam naveo.
Ovde je samo u pitanju side effect i to da li se operand dvaput izracunava kod nesto=operand++. Nisam uspeo da nadjem nesto o tome u standardu.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Primer razlike medju kompajlerima...23.12.2003. u 20:27 - pre 247 meseci
Citat:
srki:
Da malo osvezim temu.
Citat:
Dragi Tata:
Nemam ni ja standard, ali imam "Bibliju" (The C++ Programming Language 3rd edition - B. Stroustrup). Elem, najpre u odeljku 6.2 Operator summary strana 120 imate operatore poređane po prioritetu i tu se vidi da subscripting i post increment imaju isti prioritet
Ali ovde to ne vazi jer ono u zagradama mora prvo da se izracuna.


O kakvim zagradama govoriš?

a = arr[a]++;

 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.dialup.xtra.co.nz



+3 Profil

icon Re: Primer razlike medju kompajlerima...24.12.2003. u 00:08 - pre 247 meseci
Citat:
Dragi Tata:
O kakvim zagradama govoriš?

a = arr[a]++;

Pa tu mora prvo da se izracuna *(arr+a) u svakom slucaju. Zbog toga kazem da mislim da se ono sto si procitao odnosi na ovo E1++[E2] i tu ne mozes da znas da li ce prvo da se racuna E1 ili E2 i zato je bitno da izracunavanje E1 ne utice na E2 i obrnuto (nema veze sa ovim primerom).

U ovom primeru je bitno da li se operand dvaput izracunava. Jednom prilikom kod rezlutata ++ a drugom prilikom kod povecavanja vrednosti. Ja nisam uspeo da nadjem. Nasao sam recimo za razliku izmedju E1=E1+1 i E1+=1.
U prvom slucaju se E1 dvaput izracunava a u drugom slucaju samo jednom.

P.S. DT, je l' nisi imao problema zbog zemljotresa?
 
Odgovor na temu

[es] :: C/C++ programiranje :: Primer razlike medju kompajlerima...

Strane: 1 2

[ Pregleda: 5528 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.