(++i)*(++i)

Petr Kolar PETR.KOLAR na vslib.cz
Pondělí Únor 1 09:54:50 CET 1999


Oto Buchta <oto_b na jezek.buchtovi.cz> wrote:
> Dne Pá, 29 leden 1999 Jan Kurik napsal(a):
> >> 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
> >takze konstrukce >>(++i)*(++i)<< udela totez co >>(i+2)*(i+2)<<, coz je
> >podle mne vzhledem k priorite zavorek OK. Zkusil jsem to i na "MS VisualC++
> >5.0" a vysledky byly stejne. > >
> Podle mne je zásadní chyba v optimalizaci.

   Ale houby. Chyba je v programatorovi, ktery neco takoveho napise.
Jak bylo napsano v predchozim mailu:

> From:           arnost <arnost na uivt.cas.cz>
> To:             linux na linux.cz
> Subject:        Re: (++i)*(++i)

> >    Pak jsou vysledky odlisne a zalezi na kopilatoru. Nebo je snad nekde
> > specifikovano, jak takovy vyraz vyhodnotit ?
>
> norma rika, ze ne (tj. neni jasne poradi vyhodnocovani a clovek se na
> to nema spolehat)

vysledek muze byt naprosto libovolny. Proste obecne pokud se ve vyrazu
pouzije konstrukce, ktera meni hodnotu nejake promenne, nesmi se tato
promenna ve vyrazu vyskytnout vicekrat. Prekladac to totiz muze prelozit,
v jakem poradi chce. Ani nezalezi na tom, jak je to uzavorkovano, je nutne
to rozepsat na vice prikazu [ ++i; j=i*i; nebo ++i; j=i*(i+1); i++; apod.
podle toho, co chcete]. Zminenou konstrukci lze bez nebezpeci pouzit pouze
ve vyrazech, kde je poradi vyhodnocovani stanoveno (napr. operatory && ||
nebo ,).
--
                          ***  Petr Kolar  ***
 Department of Information Technologies, Technical University of Liberec
             Voronezska 1329, 461 17 Liberec, Czech Republic
             Phone: +420-48-535-2371   Fax: +420-48-535-2229
  E-mail: Petr.Kolar na vslib.cz  http://asterix.vslib.cz/staff/kolar.html


Další informace o konferenci Linux