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

Περίληψη

Αυτό το μάθημα κλείνει την τρίτη ενότητα του κύκλου μαθημάτων, αφιερωμένη στις εκφράσεις και στους τελεστές τους. Ανασυνθέτει την αλυσίδα των εννοιών που πηγαίνει από τον αριθμητικό τελεστή ως τη συνάρτηση βιβλιοθήκης, περνώντας από το δέντρο της έκφρασης και τον τύπο κάθε κόμβου, τις συνθήκες και την άλγεβρά τους, τη βραχυκύκλωση, την παρενέργεια και τη σειρά αποτίμησης, και τα bit· ξεχωρίζει όσα από αυτά ισχύουν σε κάθε γλώσσα από όσα είναι ίδια της C++· συγκεντρώνει την απροσδιόριστη συμπεριφορά της ενότητας, με όσα εντοπίζει ο μεταγλωττιστής, όσα εντοπίζει ο ανιχνευτής και όσα δεν εντοπίζει κανείς· επαναλαμβάνει στην τελική του αξιολόγηση τις δεξιότητες της αρχικής· και τελειώνει με έξι προκλήσεις που συνδυάζουν ολόκληρη την ενότητα.

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

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

Όσα πέτυχε η ενότητα

Η ενότητα έθεσε ως σκοπό να διδάξει πώς κατασκευάζονται εκφράσεις των οποίων η τιμή μπορεί να προβλεφθεί με βεβαιότητα: ποια πράξη γίνεται πρώτη, τι τύπου είναι το αποτέλεσμα, ποιες παρενέργειες έχει και ποιες εκφράσεις δεν έχουν νόημα. Ο σκοπός εκπληρώθηκε με στήριγμα μόνο όσα η εισαγωγή δήλωσε ως γνωστά: τους τύπους της ενότητας 2, τα εύρη τιμών τους και τις μετατροπές τους. Το πρόγραμμα με τις έξι ερωτήσεις, με το οποίο η εισαγωγή έθεσε το πρόβλημα, μπορεί τώρα να διαβαστεί όπως το διαβάζει ο μεταγλωττιστής και να διορθωθεί έκφραση προς έκφραση.

Αριθμητικές πράξεις

Το μάθημα Αριθμητικές πράξεις καθόρισε την ακριβή συμπεριφορά των πέντε αριθμητικών τελεστών. Η ακέραια διαίρεση αποκόπτει προς το μηδέν και ικανοποιεί την ταυτότητα (a / b) * b + a % b == a όποτε το πηλίκο έχει νόημα, ώστε το υπόλοιπο, όταν δεν είναι μηδέν, έχει το πρόσημο του διαιρετέου· γι’ αυτό το -7 / 2 αξίζει −3-3 και το -7 % 2 αξίζει −1-1, και το αν ένας αριθμός είναι περιττός ρωτιέται με n % 2 != 0. Το συνέδεσε με το ευκλείδειο υπόλοιπο, ((a % b) + b) % b για b>0b > 0, και χρησιμοποίησε και τα δύο για να αναλύσει ποσότητες. Δίδαξε να σχεδιάζουμε το δέντρο μιας έκφρασης σύμφωνα με την προτεραιότητα και την προσεταιριστικότητα, και να αποφασίζουμε τον τύπο σε κάθε κόμβο με τις συνήθεις αριθμητικές μετατροπές. Έκλεισε με τα πηλίκα χωρίς νόημα (την ακέραια διαίρεση με το μηδέν και τον μικρότερο ακέραιο διά −1-1) και με την υπερχείλιση ενός ενδιάμεσου αποτελέσματος, που αρκεί για απροσδιόριστη συμπεριφορά ακόμη κι αν το τελικό αποτέλεσμα χωρά.

Σχέσεις και λογική

Το μάθημα Σχέσεις και λογική δίδαξε ότι μια συνθήκη είναι μια έκφραση τύπου bool, με τη θέση της στο δέντρο: οι σχέσεις δένουν πιο χαλαρά από την αριθμητική, ο && πιο σφιχτά από τον ||, και ο ! πιο σφιχτά από όλους. Δίδαξε να μεταφράζουμε διατυπώσεις σε συνθήκες και να αναγνωρίζουμε εκείνες που μεταγλωττίζονται με άλλο νόημα, όπως οι 1 < x < 5 και day == 6 || 7. Έδειξε ότι οι && και || αποτιμούν τον δεύτερο τελεσταίο τους μόνο αν ο πρώτος δεν αποφασίζει, και ότι αυτή η βραχυκύκλωση επιτρέπει να προστατεύσουμε μια πράξη με έναν φρουρό στα αριστερά της. Τελείωσε με τους νόμους του Ντε Μόργκαν, που αρνούνται μια σύνθετη συνθήκη, και με το όριό τους: με μια τιμή που δεν είναι αριθμός, η !(a < b) δεν ισοδυναμεί με την a >= b.

Ανάθεση, παρενέργειες και απροσδιόριστη συμπεριφορά

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

Bit και μαθηματική βιβλιοθήκη

Το μάθημα Bit και μαθηματική βιβλιοθήκη δίδαξε ότι ένας ακέραιος είναι επίσης μια ακολουθία από bit: οι &, | και ^ εφαρμόζουν έναν λογικό σύνδεσμο σε κάθε στήλη, ο ~ αντιστρέφει όλα τα bit, και οι ολισθήσεις πολλαπλασιάζουν και διαιρούν με δυνάμεις του 2, με τον όρο ότι η ποσότητα της ολίσθησης δεν είναι αρνητική ούτε φτάνει το πλάτος του τύπου. Με αυτούς κατασκεύασε τις μάσκες που ελέγχουν, ενεργοποιούν, απενεργοποιούν και εναλλάσσουν ένα bit. Προειδοποίησε ότι αυτοί οι τελεστές δένουν πιο χαλαρά από τις σχέσεις, ώστε η x & 1 == 0 δεν ρωτά αυτό που φαίνεται, και ότι ο ^ δεν είναι η δύναμη. Έκλεισε με τη βιβλιοθήκη: οι <cmath>, <numbers>, <numeric> και <bit> δίνουν υπολογισμούς σωστούς και δοκιμασμένους, με τις δικές τους προσυνθήκες, όπως αυτή της απόλυτης τιμής, που δεν υπάρχει για τον μικρότερο ακέραιο.