Μετάβαση στο περιεχόμενο
Topos Uranos

Περίληψη

Μια έκφραση της C++ μπορεί να κάνει δύο διαφορετικά πράγματα: να δώσει μια τιμή και να αλλάξει την κατάσταση του προγράμματος. Το x + 1 δίνει μόνο μια τιμή· το x = 7 δίνει μια τιμή και, επιπλέον, αλλάζει τη x· το x++ δίνει την τιμή που είχε η x και αφήνει στη x άλλη. Το μάθημα αυτό μελετά αυτή τη διαφορά ανάμεσα στην τιμή και την επίδραση μιας έκφρασης: την ανάθεση ως έκφραση, τη σύνθετη ανάθεση, την αύξηση και τη μείωση στην προθεματική και τη μεταθεματική τους μορφή, και τη σειρά με την οποία αποτιμώνται τα μέρη μιας έκφρασης, την οποία το πρότυπο καθορίζει μόνο εν μέρει. Από αυτό προκύπτει το ερώτημα που οργανώνει το υπόλοιπο μάθημα: τι υπόσχεται το πρότυπο για ένα πρόγραμμα. Η απάντηση είναι ένας κατάλογος τεσσάρων βαθμίδων, από την ορισμένη έως την απροσδιόριστη συμπεριφορά, που συγκεντρώνει όλες τις περιπτώσεις που είδαμε ως εδώ και λέει, για καθεμία, τι την ανιχνεύει (ο μεταγλωττιστής, ο ανιχνευτής, η βιβλιοθήκη) και τι δεν το ανιχνεύει κανείς.

Μαθησιακοί στόχοι

  1. Να διακρίνει την τιμή μιας έκφρασης από την παρενέργειά της σε αναθέσεις, αυξήσεις και κλήσεις.
  2. Να προβλέπει το αποτέλεσμα των x++ και ++x όταν χρησιμοποιούνται ως τιμή, και να ακολουθεί με το χέρι ένα πρόγραμμα με σύνθετες αναθέσεις.
  3. Να αναγνωρίζει εκφράσεις που τροποποιούν δύο φορές μια μεταβλητή, ή που τη διαβάζουν και την τροποποιούν, χωρίς σειρά καθορισμένη από το πρότυπο, και να τις ξαναγράφει σε χωριστές εντολές.
  4. Να κατατάσσει μια κατασκευή ως ορισμένη, οριζόμενη από την υλοποίηση, αδιευκρίνιστη ή απροσδιόριστη, με ένα παράδειγμα από κάθε κατηγορία.
  5. Να λέει, για κάθε απροσδιόριστη συμπεριφορά του καταλόγου, αν την επισημαίνει ο μεταγλωττιστής, αν τη σταματά ο ανιχνευτής ή η βιβλιοθήκη, ή αν δεν την ανιχνεύει κανείς.

Η τιμή και η επίδραση

Το μάθημα Αριθμητικές πράξεις μελέτησε την έκφραση ως ένα δέντρο που ανάγεται σε μια τιμή: το 2 + 3 * 4 ισούται με 14, και ο υπολογισμός του δεν αλλάζει τίποτε έξω από την ίδια την έκφραση. Το μάθημα Σχέσεις και λογική έκανε το ίδιο με τις συνθήκες, των οποίων η τιμή είναι true ή false. Ωστόσο, υπάρχουν εκφράσεις που, εκτός από το ότι δίνουν μια τιμή, αφήνουν ένα ίχνος στην κατάσταση του προγράμματος: αλλάζουν την τιμή μιας μεταβλητής, γράφουν στην οθόνη ή διαβάζουν από την είσοδο. Αυτό το ίχνος λέγεται παρενέργεια, ή απλώς επίδραση, και το «παρά» της λέξης δεν σημαίνει ότι έχει μικρότερη σημασία: στο x = 7 η επίδραση, να γίνει η x ίση με 7, είναι ακριβώς αυτό που επιδιώκουμε.

Αν αυτό ισχύει, κάθε έκφραση πρέπει να διαβάζεται με δύο ερωτήματα: τι δίνει και τι κάνει. Τρία παραδείγματα παγιώνουν τη διάκριση. Το count + 1 δίνει τον ακέραιο που ακολουθεί την count και δεν κάνει τίποτε: η count διατηρεί την τιμή της. Το count = 9 δίνει 9 και κάνει τη count ίση με 9. Το std::println("γεια") είναι επίσης έκφραση, μια κλήση συνάρτησης, και αυτό που μετρά σε αυτήν είναι η επίδρασή της: να γράψει μια γραμμή. Οι δικές μας συναρτήσεις θα μελετηθούν στο μάθημα Συναρτήσεις, και εκεί η διάκριση θα επανέλθει: μια συνάρτηση που μόνο υπολογίζει το αποτέλεσμά της είναι ευκολότερο να την καταλάβει και να τη δοκιμάσει κανείς από μια που, επιπλέον, αλλάζει κάτι έξω από αυτήν.

Μια εντολή όπως η count + 1; είναι έγκυρη C++: η τιμή υπολογίζεται και απορρίπτεται, ώστε δεν χρησιμεύει σε τίποτε, και ο GCC προειδοποιεί γι’ αυτό με το -Wunused-value. Μια εντολή έκφρασης έχει νόημα χάρη στην επίδρασή της. Από αυτό προκύπτει ότι οι εκφράσεις με επίδραση είναι εκείνες που κινούν το πρόγραμμα, και επίσης εκείνες που απαιτούν προσοχή, επειδή η επίδραση συμβαίνει σε κάποια στιγμή, και αυτή η στιγμή δεν είναι πάντα εκείνη που υποθέτει ο αναγνώστης.