Tadej Slemc wrote:
> 
> #include <iostream.h>
> int main()
> {
>   int j,i=2;
>   j=((++i)*(++i)*(++i));
>   cout << i << " " << j << endl;
>   i=2;
>   j=((i++)*(i++)*(i++));
>   cout << i << " " << j << endl;
> }
> 
> No ta program vrne izpis
> 5  80
> 5  8
> 
> Ce pa bi racunal to stvar na roke bi izgledalo nekako takole:
> 5  60
> 5  24
> 
> Zanima me pa kje je fora, da on iz domnevnega 3*4*5 dobi 80? ....
> 
Fora je zelo preprosta: j=(++i)*(++i)*(++i); prevede prevajalnik tako,
da pred prvim zmnozkom ustrezno poveca i in sele nato zmnozi (ker prej
pac ne more mnoziti) 4*4, nato se zadnjic poveca i in se zadnjic
zmnozi in zatorej dobis 80. Pri postinkrementu pa prevajalnik vedno
poveca spremenljivke po opravljenem ukazu, zatorej v bistvu zmnozi
2*2*2 in sele nato opravi vse inkremente.
In komentar? V nesteto bukvah o programiranju v Cju in celo pri vecini
prevajalnikov opozarjajo, da so taki konstrukti sila nevarni, ker nikoli
ne ves, kako bo konkretno tvoj prevajalnik stvar prevedel. Vcasih je
celo odvisno od tipa optimizacije.

                                                           -AlesS
-----------------------------------------------------------------------
  [EMAIL PROTECTED]
  http://aless.rulz.org/                            The Wizzard Of Oz
-----------------------------------------------------------------------

Reply via email to