|
From: Bernardo I. <be...@de...> - 2002-05-13 00:31:46
|
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Sunday 12 May 2002 06:21, you wrote:
> Devi togliermi una curiosit=E0 paurosa perch=E8 non so se riuscir=F2 a=
d
> arrivare a luned=EC pomeriggio senza scervellarmi.
> Ho visto cosa hai cambiato per fixare e non riesco a capire dove sia
> la differenza tra prima e dopo il fix (tra l'altro ci sono le
> parentesi). Dipende esclusivamente dal compilatore?
> oppure c'=E8 veramente un motivo di codice per il quale non funziona?
> (ci credo poco)
Dunque, l'operatore di post-incremento (x++) ha un comportamento
piusttosto facile da definire in modo informale, ma la sua presenza
nel linguaggio ha costretto il comitato di standardizzazione a
descrivere minuziosamente come i compilatori devono affrontare
tutta una serie di casistiche in cui l'uso sconsiderato del
post-incremento (e del post-decremento) possono creare ambiguita'.
Per esempio:
int a =3D 0;
printf("%d, %d, ", a++, a++);
printf("%d\n", a);
A seconda di come si interpreta il significato del post-incremento,
questo codice potrebbe produrre come output:
0 0 2 - l'incremento avviene al termine dell'istruzione)
0 1 2 - l'incremento avviene immediatamente dopo l'uso)
1 0 2 - come sopra, ma in molte architetture i parametri
delle funzioni vengono valutati da destra verso
sinistra! Questo perche' i parametri vengono messi
nello stack in ordine inverso.
Nel nostro caso, prima avevamo un'espreassione nella forma:
a =3D a++ % b;
che io ho cambiato in:
a++;
a =3D a % b;
per rendere univoco il comportamento indipendentamente dal
compilatore usato.
Secondo me (ma bisognerebbe andare a vedere nello standard,
il risultato corretto per la prima versione era quello
riscontrato su Linux: non cambiare affatto il valore di "a".
La variabile viene incrementata subito dopo averla valutata,
ma il suo valore viene nuovamente sovrascritto
dall'assegnamento. Credo insomma che scrivere:
a =3D a++;
non sia, come sembra a prima vista, solo un modo strano
di scrivere
a =3D a + 1;
oppure
a++;
- --=20
// Bernardo Innocenti - Develer S.r.l., R&D dept.
\X/ http://www.develer.com/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iEYEARECAAYFAjzfCcoACgkQltU4TfxqZsqMKQCglMrR6ih1/lgYa5uXaPPcGrQq
ETQAn1rQe/UaFg1W0RcLGBKO1JLFxQmO
=3DkNuB
-----END PGP SIGNATURE-----
|