the ++ operator

Vasilis Vasaitis vvas at hal.csd.auth.gr
Thu Nov 20 01:27:01 EET 2003


On Wed, Nov 19, 2003 at 11:40:00PM +0200, Giannis Vrentzos wrote:
> Tom Diamond wrote:
> >Ρε παιδιά, τρέχω το παρακάτω:

..[snip]..

> >  printf("%f\n", c);
> >
> >  c = 0.0; i = 0;
> >  c += a[i]+b[i++] + a[i]+b[i];
>     ****** To i ^^^^ 8a ay3h8ei kata 1 meta to telos ths pros8eshs*****
>     c = c   + a[0] + b[0] + a[0] + b[0]
>     c = 0.0 + 0.1  + 4.1  + 0.1  + 4.1
> 
> Thn grammh ayth mporeis na thn kaneis c += a[i]+b[i]+a[++i]+b[i] kai 8a 
> exeis to swsto apotelesma alla kalytera na apofygeis ayton ton tropo.

  Πωπω, είστε τελείως φονιάδες και οι δύο. Τέτοιες παραστάσεις σαν
αυτές που γράφετε για το c += ... είναι τελείως άτοπες, γιατί πολύ
απλά δεν υπάρχει καμία εγγύηση για τη σειρά με την οποία θα υπολογίσει
ο compiler τα επιμέρους ορίσματα της πρόσθεσης. Δηλαδή, όταν γράφουμε:

	c = a[i] + b[i++];

τότε ο compiler δεν υποχρεούται να υπολογίσει τα a[i] και b[i++] με
κάποια συγκεκριμένη σειρά, οπότε στο a[i] μπορεί το i να έχει ήδη
προσαυξηθεί, μπορεί και όχι. Φυσικά, το ίδιο ακριβώς ισχύει αν έχουμε
++i, δεν αλλάζουν και πολλά. Η ουσία είναι ότι τέτοιες παραστάσεις
έχουν undefined behaviour, όπως λέμε, δηλαδή ο compiler κάνει ό,τι
γουστάρει, οπότε δε βασιζόμαστε και τις γράφουμε κάπως αλλιώς.

-- 
Vasilis Vasaitis
vvas at hal.csd.auth.gr
+306976604701





More information about the Linux-greek-users mailing list