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