Gcc: (++i)*(++i)
Martin Mares
mj na ucw.cz
Pátek Leden 29 17:47:10 CET 1999
Zdravim,
> myslite si, ze je v C mozno pouzit (s jednoznacne definovanym
> vysledkem) konstrukci ze Subjectu - (++i)*(++i)? Pri zkompilovani
> gcc 2.7.2.3 i egcs-1.03 je vysledek druha mocnina, coz neni to, co bych
> si predstavoval. Pritom po nahrazeni ++i za i+=1, coz by melo byt
> ekvivalentni, je vysledek v poradku - pro nejake puvodni i to vrati
> (i+1)*(i+2).
Norma jednoznacne definuje, ze vyrazy tohoto typu nejsou
jednoznacne definovane :-))
Side-effecty operatoru (v tomto pripade preincrementy) maji stanovene
poradi pouze vzhledem ke svym operandum (tedy ze pri ++i bude nejdrive
proveden side-effect a teprve potom [nikoliv nutne bezprostredne potom]
vyhodnoceno i) a vzhledem k sequencing-pointum (coz jsou &&, ||, ?, :, ;,
volani funkce, navrat z funkce a carka oddelujici parametry [nikoliv
ovsem carka jakozto operator zapomenuti]).
Tedy:
a++ + ++a neni jednoznacne
a++ && ++a je jednoznacne
f(a++, a++) je jednoznacne
(a++, a++) neni jednoznacne
A tak dale.
Have a nice fortnight
--
Martin `MJ' Mares <mj na ucw.cz> http://atrey.karlin.mff.cuni.cz/~mj/
Faculty of Math and Physics, Charles University, Prague, Czech Rep., Earth
"A. G. Bell is alive and well in New York and still waiting for the dial tone."
Další informace o konferenci Linux