Στη γλώσσα C, ποια είναι η διαφορά μεταξύ της χρήσης του ++i
και του i++
, και ποιο από τα δύο πρέπει να χρησιμοποιείται στο μπλοκ αύξησης ενός βρόχου for
;
Το ++i
θα αυξήσει την τιμή του i
και στη συνέχεια θα επιστρέψει την αυξημένη τιμή.
i = 1;
j = ++i,
(i είναι 2, j είναι 2)
Το i++
θα αυξήσει την τιμή του i
, αλλά θα επιστρέψει την αρχική τιμή που είχε το i
πριν αυξηθεί.
i = 1;
j = i++,
(i είναι 2, j είναι 1)
Για έναν βρόχο "for", και τα δύο λειτουργούν. Το ++i
φαίνεται πιο συνηθισμένο, ίσως επειδή αυτό χρησιμοποιείται στο K&R.
Σε κάθε περίπτωση, ακολουθήστε την οδηγία "προτιμήστε το ++i
από το i++
" και δεν θα κάνετε λάθος.
Υπάρχουν μερικά σχόλια σχετικά με την αποτελεσματικότητα του ++i
και του i++
. Σε οποιονδήποτε μεταγλωττιστή που δεν είναι φοιτητικό πρόγραμμα, δεν θα υπάρχει διαφορά στην απόδοση. Μπορείτε να το επαληθεύσετε αυτό κοιτάζοντας τον παραγόμενο κώδικα, ο οποίος θα είναι πανομοιότυπος.
Η ερώτηση για την αποδοτικότητα είναι ενδιαφέρουσα... εδώ είναι η προσπάθειά μου να απαντήσω: <https://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i>,
Όπως σημειώνει ο On Freund, είναι διαφορετικό για ένα αντικείμενο της C++, αφού η operator++()
είναι μια συνάρτηση και ο μεταγλωττιστής δεν μπορεί να ξέρει να βελτιστοποιήσει τη δημιουργία ενός προσωρινού αντικειμένου για να κρατήσει την ενδιάμεση τιμή.
Το ++i
αυξάνει την τιμή και στη συνέχεια την επιστρέφει.
Το i++
επιστρέφει την τιμή και στη συνέχεια την αυξάνει.
Είναι μια λεπτή διαφορά.
Για έναν βρόχο for, χρησιμοποιήστε το ++i
, καθώς είναι ελαφρώς ταχύτερο. Το i++
θα δημιουργήσει ένα επιπλέον αντίγραφο το οποίο απλά πετιέται.
Ο λόγος για τον οποίο το ++i
μπορεί να είναι ελαφρώς ταχύτερο από το i++
είναι ότι το i++
μπορεί να απαιτήσει ένα τοπικό αντίγραφο της τιμής του i πριν από την αύξησή της, ενώ το ++i
δεν το κάνει ποτέ. Σε ορισμένες περιπτώσεις, ορισμένοι μεταγλωττιστές θα το βελτιστοποιήσουν αν είναι δυνατόν... αλλά δεν είναι πάντα δυνατό, και δεν το κάνουν όλοι οι μεταγλωττιστές.
Προσπαθώ να μην βασίζομαι πάρα πολύ στις βελτιστοποιήσεις των μεταγλωττιστών, οπότε θα ακολουθούσα τη συμβουλή του Ryan Fox: όταν μπορώ να χρησιμοποιήσω και τα δύο, χρησιμοποιώ το ++i
.