Περίληψη
Αυτό το μάθημα κλείνει τη δεύτερη ενότητα του κύκλου μαθημάτων, αφιερωμένη στα δεδομένα και στους τύπους τους. Ανασυνθέτει την αλυσίδα των εννοιών που οδηγεί από τη μεταβλητή στη σταθερά την οποία επιτηρεί ο μεταγλωττιστής, περνώντας από τη δυαδική αναπαράσταση των ακεραίων και τις δύο υπερχειλίσεις τους, τους προσεγγιστικούς πραγματικούς και την ανοχή, τους χαρακτήρες ως κωδικούς και τις μετατροπές που χάνουν πληροφορία· ξεχωρίζει ό,τι από αυτά ισχύει σε κάθε γλώσσα από ό,τι είναι ίδιον της C++· συγκεντρώνει την απροσδιόριστη συμπεριφορά της ενότητας, με ό,τι ανιχνεύει ο μεταγλωττιστής, ό,τι ανιχνεύει ο ανιχνευτής (sanitizer) και ό,τι δεν ανιχνεύει κανείς· επαναλαμβάνει στην τελική αξιολόγησή του τις δεξιότητες της αρχικής· και τελειώνει με έξι προκλήσεις που συνδυάζουν ολόκληρη την ενότητα.
Μαθησιακοί στόχοι
- Να επιλέγει και να αιτιολογεί τον τύπο κάθε δεδομένου ενός προβλήματος σύμφωνα με τις τιμές που μπορεί να πάρει, την ακρίβεια που απαιτεί και τις πράξεις που θα γίνουν με αυτό.
- Να προβλέπει τις συνέπειες των ορίων της αναπαράστασης σε ένα δοσμένο πρόγραμμα: την υπερχείλιση των ακεραίων, τη στρογγυλοποίηση της κινητής υποδιαστολής και την απώλεια πληροφορίας μιας μετατροπής.
- Να χρησιμοποιεί σταθερές με όνομα και ρητές μετατροπές, και να εξηγεί τι ελέγχει ο μεταγλωττιστής σε κάθε περίπτωση.
- Να αναγνωρίζει την απροσδιόριστη συμπεριφορά της ενότητας και να λέει, για κάθε περίπτωση, τι την ανιχνεύει και πώς προλαμβάνεται.
- Να ξεχωρίζει, σε όσα έμαθε στην ενότητα, ό,τι ισχύει σε κάθε γλώσσα από ό,τι είναι ίδιον της C++.
Όσα πέτυχε η ενότητα
Η ενότητα έθεσε ως σκοπό να διδάξει ότι κάθε δεδομένο ζει στη μνήμη με έναν τύπο που καθορίζει ποιες τιμές μπορεί να πάρει, πόσο χώρο καταλαμβάνει και ποιες πράξεις δέχεται, και ότι αυτά τα όρια έχουν παρατηρήσιμες συνέπειες. Ο σκοπός εκπληρώθηκε με στήριγμα μόνο όσα η εισαγωγή δήλωσε ως γνωστά: τον κύκλο εργασίας της μεταγλώττισης και της εκτέλεσης με τις επιλογές του κύκλου μαθημάτων, τη μορφοποιημένη έξοδο, την ανάγνωση με τη std::cin και την ανάγνωση των μηνυμάτων του μεταγλωττιστή. Το πρόγραμμα των τεσσάρων υπολογισμών με το οποίο η εισαγωγή έθεσε το πρόβλημα μπορεί τώρα να εξηγηθεί γραμμή προς γραμμή, και να διορθωθεί.
Μεταβλητές και μνήμη
Το μάθημα Μεταβλητές και μνήμη καθιέρωσε ότι μια μεταβλητή είναι ένα κελί μνήμης με όνομα, αμετάβλητο τύπο και τιμή που αλλάζει, και ότι ο τύπος καθορίζει το μέγεθός της, το οποίο μετρά ο sizeof. Διέκρινε την αρχικοποίηση από την ανάθεση, έδειξε ότι τα άγκιστρα απορρίπτουν μια μετατροπή με απώλεια, και δίδαξε ότι η ανάθεση αντιγράφει και δεν συνδέει, και ότι η τιμή που αντικαθίσταται χάνεται· από αυτό έπεται η βοηθητική μεταβλητή της αντιμετάθεσης. Όρισε την κατάσταση ενός προγράμματος ως το σύνολο των τιμών των μεταβλητών του και δίδαξε πώς την ακολουθούμε με έναν πίνακα ίχνους. Καθόρισε τις συμβάσεις των ονομάτων και έκλεισε με την πρώτη απροσδιόριστη συμπεριφορά της ενότητας: την ανάγνωση μιας μεταβλητής που δεν πήρε ποτέ τιμή.
Οι ακέραιοι και η αναπαράστασή τους
Το μάθημα Οι ακέραιοι και η αναπαράστασή τους δίδαξε το θεσιακό σύστημα αρίθμησης στις βάσεις 10, 2 και 16. Από το ότι ένας τύπος έχει bit συνήγαγε το εύρος τιμών του: συνδυασμοί bit, που χωρίς πρόσημο αναπαριστούν τους αριθμούς από έως και με πρόσημο, σε συμπλήρωμα ως προς δύο, από έως , με έναν αρνητικό περισσότερο από τους θετικούς. Διέκρινε τις δύο υπερχειλίσεις: εκείνη των μη προσημασμένων ακεραίων, που είναι αριθμητική modulo και είναι ορισμένη (το 0u - 1 ισούται με ), και εκείνη των προσημασμένων ακεραίων, που είναι απροσδιόριστη συμπεριφορά και την οποία σταματά ο ανιχνευτής. Έδειξε ότι η σύγκριση ενός προσημασμένου ακεραίου με έναν μη προσημασμένο μετατρέπει τον πρώτο, ώστε η σύγκριση να είναι ψευδής, και τελείωσε με ένα κριτήριο για την επιλογή του ακέραιου τύπου σύμφωνα με το προβλέψιμο εύρος του δεδομένου.
Οι αριθμοί κινητής υποδιαστολής
Το μάθημα Οι αριθμοί κινητής υποδιαστολής έδειξε ότι ένας πραγματικός αποθηκεύεται ως πρόσημο, εκθέτης και δυαδική mantissa, ώστε οι αναπαραστάσιμες τιμές να είναι ένα πεπερασμένο σύνολο ρητών με παρονομαστή δύναμη του 2. Από αυτό προέκυψε ότι ο αριθμός δεν υπάρχει στη μηχανή: στη θέση του αποθηκεύεται η πλησιέστερη τιμή double, και το 0.1 + 0.2 γράφεται 0.30000000000000004. Το μάθημα έδωσε ένα φράγμα για το σφάλμα κάθε στρογγυλοποίησης, έδειξε ότι τα σφάλματα συσσωρεύονται και ότι η πρόσθεση παύει να είναι προσεταιριστική· από όπου συνήγαγε ότι δύο υπολογισμένοι πραγματικοί δεν συγκρίνονται με ==, αλλά με βάση την απόστασή τους, με μια αιτιολογημένη ανοχή. Καθόρισε τον double ως προεπιλεγμένο πραγματικό τύπο, και παρουσίασε το άπειρο και τον μη αριθμό, NaN.
Χαρακτήρες, λογικές τιμές, μετατροπές και σταθερές
Το μάθημα Χαρακτήρες, λογικές τιμές, μετατροπές και σταθερές έδειξε ότι ένας τύπος είναι ένας κανόνας για την ανάγνωση των bit: ένας char αποθηκεύει ένα byte του οποίου η τιμή είναι ο κωδικός ASCII του χαρακτήρα, και επειδή τα ψηφία και τα γράμματα έχουν διαδοχικούς κωδικούς, το '7' - '0' ισούται με 7· ένας bool είναι αληθής ή ψευδής, και κάθε αριθμός διάφορος του μηδενός μετατρέπεται σε αληθή. Μελέτησε τις έμμεσες μετατροπές και καθιέρωσε ότι η μετατροπή γίνεται μέσα στην πράξη, σύμφωνα με τον τύπο των τελεστέων, και όχι κατά την αποθήκευση του αποτελέσματος: με double r{7 / 2} η τιμή είναι 3. Δίδαξε πώς γράφεται η επιθυμητή μετατροπή με τον static_cast, που δεν αποτρέπει την απώλεια, αλλά τη δηλώνει· διευκρίνισε ότι τα άγκιστρα απορρίπτουν τη στένωση, και έδειξε την τρίτη απροσδιόριστη συμπεριφορά της ενότητας, τη μετατροπή σε ακέραιο ενός πραγματικού που δεν χωρά. Έκλεισε με τις σταθερές (const, constexpr και static_assert), τον τύπο των literal και τον auto.
Φόρτωση του περιεχομένου…
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας