Περίληψη
Αυτό το μάθημα ανοίγει την τρίτη ενότητα του κύκλου μαθημάτων, αφιερωμένη στις εκφράσεις και στους τελεστές τους. Εξηγεί σε τι χρησιμεύει η ενότητα: να διδάξει πώς κατασκευάζονται εκφράσεις των οποίων η τιμή μπορεί να προβλεφθεί με βεβαιότητα, γνωρίζοντας ποια πράξη γίνεται πρώτη, τι τύπου είναι το αποτέλεσμα, ποιες παρενέργειες έχει και ποιες εκφράσεις δεν έχουν σημασία· παρουσιάζει τα τέσσερα μαθήματά της και το νήμα που τα ενώνει, από την ακέραια και την πραγματική αριθμητική ως τα bit και τη μαθηματική βιβλιοθήκη, περνώντας από τις συνθήκες και από τον κατάλογο της απροσδιόριστης συμπεριφοράς· θυμίζει όσα η ενότητα θεωρεί γνωστά από τη δεύτερη, δηλαδή τον τύπο κάθε δεδομένου, τα όριά του και τις μετατροπές του· διατυπώνει το πρόβλημα που λύνει η ενότητα, το πρόβλημα ενός προγράμματος που μεταγλωττίζεται χωρίς ούτε μία προειδοποίηση και του οποίου οι απαντήσεις σε έξι σχολικές ερωτήσεις είναι όλες λανθασμένες, όταν δεν λείπουν· και δείχνει πού οδηγεί, στις ενότητες που ακολουθούν και στον κύκλο μαθημάτων Προγραμματισμός σε C++ II.
Μαθησιακοί στόχοι
- Να περιγράφουμε τη σειρά των περιεχομένων της ενότητας και να εξηγούμε τι προσφέρει κάθε μάθημα σε εκείνο που ακολουθεί.
- Να θυμόμαστε όσα χρειάζονται από την ενότητα 2 (τους ακέραιους και τους πραγματικούς τύπους, τα εύρη τιμών τους, την υπερχείλιση και τις μετατροπές) και να τα επαναλαμβάνουμε αν χρειάζεται.
- Να προαναγγέλλουμε, με ένα παράδειγμα, ότι η τιμή μιας έκφρασης εξαρτάται από κανόνες αποτίμησης (την προτεραιότητα, τον τύπο των τελεσταίων, τη σειρά των επιδράσεων) που δεν συμπίπτουν πάντοτε με εκείνους των σχολικών μαθηματικών.
- Να αναγνωρίζουμε τι αναμένεται να ξέρουμε να κάνουμε στο τέλος της ενότητας, και να το διακρίνουμε από όσα θα μάθουμε στις ενότητες που ακολουθούν.
Αρχική αξιολόγηση
Πριν διατρέξουμε την ενότητα, αξίζει να μετρήσουμε το σημείο εκκίνησης. Η αξιολόγηση αυτή είναι αυτοαξιολόγηση: δεν βαθμολογείται, και μοναδικός σκοπός της είναι να προσανατολίσει τη μελέτη. Οι τέσσερις πρώτες ερωτήσεις ελέγχουν όσα η ενότητα θεωρεί γνωστά από τη δεύτερη: την ακέραια διαίρεση, τη γραφή στη βάση 2, την αφαίρεση χωρίς πρόσημο και την υπερχείλιση με πρόσημο. Οι έξι που ακολουθούν αγγίζουν, με τη σειρά των μαθημάτων, τις κεντρικές ιδέες της ενότητας, και αρκετές από αυτές ξεκινούν από τα σχολικά μαθηματικά ή από τη στοιχειώδη λογική. Κανείς δεν είναι υποχρεωμένος να τις απαντήσει σωστά ακόμη, και σε δύο από αυτές το «δεν το ξέρω ακόμη» είναι τίμια απάντηση: κάθε απάντηση, σωστή ή λανθασμένη, εξηγεί το ζήτημα και κατονομάζει το μάθημα που το πραγματεύεται. Οι ίδιες δεξιότητες μετρώνται ξανά στο τέλος, στο μάθημα της σύνθεσης.
Πριν ξεκινήσεις την ενότητα, μέτρησε το σημείο εκκίνησής σου. Είναι μια σύντομη αυτοαξιολόγηση: δεν βαθμολογείται και το αποτέλεσμα αποθηκεύεται μόνο στον περιηγητή σου.
Ερώτηση 1Από προηγούμενες ενότητεςΈνα πρόγραμμα δηλώνει
const double r{7 / 2};και γράφει τοr. Τι εμφανίζεται;Πιστεύει ότι ο τύπος της μεταβλητής αποφασίζει πώς γίνεται η διαίρεση· το αποφασίζει ο τύπος των τελεσταίων.Πιστεύει ότι η ακέραια διαίρεση στρογγυλοποιεί· στην πραγματικότητα απορρίπτει το δεκαδικό μέρος.Η τιμή 3 είναι σταθερή και αναπαρίσταται ακριβώς σεdouble: δεν υπάρχει στένωση που να πρέπει να απορριφθεί.Η διαίρεση7 / 2γίνεται ανάμεσα σε ακεραίους και δίνει το ακέραιο πηλίκο, 3· μόνο έπειτα αυτό το 3 μετατρέπεται σεdouble. Ο τύπος των τελεσταίων αποφασίζει την πράξη, όχι ο τύπος της μεταβλητής που δέχεται το αποτέλεσμα. Το μάθημα 3.1 μετατρέπει αυτή την παρατήρηση σε γενικό κανόνα: ο τύπος αποφασίζεται σε κάθε κόμβο της έκφρασης.Επανάληψη: Χαρακτήρες, λογικές τιμές, μετατροπές και σταθερές
Ερώτηση 2Από προηγούμενες ενότητεςΠώς γράφεται ο αριθμός 13 στη βάση 2, με οκτώ bit;
Αθροίζει λάθος τα βάρη: .Γράφει τα υπόλοιπα των διαδοχικών διαιρέσεων με τη σειρά που βγαίνουν· διαβάζονται από το τελευταίο προς το πρώτο.Αυτό το μοτίβο είναι το 26, το διπλάσιο του 13: τα bit έχουν μετατοπιστεί κατά μία θέση.Κάθε θέση έχει διπλάσιο βάρος από εκείνη που βρίσκεται στα δεξιά της: οι μονάδες καταλαμβάνουν τις θέσεις με βάρος 8, 4 και 1. Το μάθημα 3.4 δουλεύει απευθείας πάνω σε αυτά τα bit, γι’ αυτό αξίζει να τα διαβάζουμε με άνεση.Επανάληψη: Οι ακέραιοι και η αναπαράστασή τους
Ερώτηση 3Από προηγούμενες ενότητεςΤι γράφει η εντολή
std::println("{}", 0u - 1);μεunsigned intτων 32 bit;Δεν λαμβάνει υπόψη την κατάληξηu: ένας μη προσημασμένος τύπος δεν έχει αρνητικές τιμές.Συγχέει τη μη προσημασμένη αριθμητική, που είναι ορισμένη modulo , με την προσημασμένη υπερχείλιση.Πιστεύει ότι η αφαίρεση σταματά στη μικρότερη τιμή του τύπου· στην πραγματικότητα κάνει κύκλο.Η μη προσημασμένη αριθμητική είναι αριθμητική modulo : . Το αποτέλεσμα είναι ορισμένο, και γι’ αυτό κανένας ανιχνευτής δεν το επισημαίνει. Η ενότητα το συναντά ξανά στις μετατροπές μιας μικτής έκφρασης και στους τελεστές bit, που γράφονται με μη προσημασμένους τύπους.Επανάληψη: Οι ακέραιοι και η αναπαράστασή τους
Ερώτηση 4Από προηγούμενες ενότητεςΈνα πρόγραμμα εκτελεί
int count{std::numeric_limits<int>::max()};και έπειταcount = count + 1;. Τι εγγυάται το πρότυπο για την τιμή τουcount;Συγχέει ό,τι παρατηρείται μερικές φορές με ό,τι εγγυάται το πρότυπο· η επιστροφή στο ελάχιστο είναι αυτό που κάνουν οι μη προσημασμένοι, όχι οι προσημασμένοι.Αγνοεί το όριο του τύπου: αυτός ο αριθμός δεν χωρά σεintτων 32 bit.Ο μεταγλωττιστής δεν γνωρίζει τις τιμές που θα έχει το πρόγραμμα όταν εκτελεστεί· σχεδόν πάντα μεταγλωττίζει χωρίς να πει τίποτα.Η πρόσθεση έχει μια προσυνθήκη, ότι το αποτέλεσμα χωρά στον τύπο, και έξω από αυτήν το πρότυπο δεν υπόσχεται τίποτα. Ο ανιχνευτής του κύκλου μαθημάτων σταματά το πρόγραμμα· χωρίς αυτόν, μπορεί να γραφτεί οτιδήποτε. Το μάθημα 3.3 συγκεντρώνει αυτή την περίπτωση μαζί με τις άλλες του ίδιου είδους σε έναν κατάλογο.Επανάληψη: Οι ακέραιοι και η αναπαράστασή τους
Ερώτηση 5Πόσο κάνει το και πόσο το ;
Κάνει τις πράξεις από αριστερά προς τα δεξιά χωρίς να προσέχει την προτεραιότητα του γινομένου.Αγνοεί τις παρενθέσεις της δεύτερης έκφρασης.Αποδίδει σε κάθε έκφραση την τιμή της άλλης: αντιστρέφει το αποτέλεσμα των παρενθέσεων.Το γινόμενο δένει ισχυρότερα από το άθροισμα: στο γίνεται πρώτα ο πολλαπλασιασμός, και οι παρενθέσεις αλλάζουν αυτή τη σειρά. Η C++ ακολουθεί την ίδια σύμβαση, και το μάθημα 3.1 την επεκτείνει στη διαίρεση, στο υπόλοιπο και στην προσεταιριστικότητα, με όργανο το δέντρο της έκφρασης.Επανάληψη: Αριθμητικές πράξεις
Ερώτηση 6Σύμφωνα με το θεώρημα της διαίρεσης των μαθηματικών, με το υπόλοιπο να υπόκειται στον περιορισμό , ποιο είναι το πηλίκο και ποιο το υπόλοιπο της διαίρεσης του με το ;
Είναι αυτό που υπολογίζει η C++, αλλά δεν ικανοποιεί τον περιορισμό : το υπόλοιπο των μαθηματικών δεν είναι αρνητικό.Δεν ελέγχει την ταυτότητα: , όχι .Ούτε αυτό ικανοποιεί την ταυτότητα: .Το θεώρημα απαιτεί με , και αυτοί οι δύο αριθμοί είναι οι μόνοι που το ικανοποιούν. Η C++, αντίθετα, αποκόπτει το πηλίκο προς το μηδέν: το-7 / 2ισούται με και το-7 % 2με . Το μάθημα 3.1 εξηγεί τη διαφορά και διδάσκει πώς προκύπτει το υπόλοιπο των μαθηματικών από εκείνο της C++.Επανάληψη: Αριθμητικές πράξεις
Ερώτηση 7Ποια είναι η άρνηση της πρότασης «βρέχει και κάνει κρύο»;
Αρνείται κάθε μέρος χωρίς να αλλάξει τον σύνδεσμο: αυτό ισχυρίζεται πολύ περισσότερα από την άρνηση, γιατί αποκλείει και τη στεγνή και κρύα μέρα.Αρνείται μόνο ένα από τα μέρη.Λέει το ίδιο με τη δεύτερη επιλογή, με το ίδιο σφάλμα.Η άρνηση μιας σύζευξης είναι η διάζευξη των αρνήσεων: είναι ένας από τους νόμους του Ντε Μόργκαν. Αρκεί να λείπει ένα από τα δύο για να είναι ψευδής ο ισχυρισμός. Το μάθημα 3.2 εφαρμόζει τον ίδιο νόμο στις συνθήκες ενός προγράμματος.Επανάληψη: Σχέσεις και λογική
Ερώτηση 8Τι γράφει η εντολή
std::println("{}", 3 < 5);;Πιστεύει ότι η λογική τιμή γράφεται ως αριθμός· με τη θέση αντικατάστασης{}, ηstd::printlnγράφει τη λέξη.Πιστεύει ότι η έκφραση γράφεται ως κείμενο· αυτό που γράφεται είναι η τιμή της.Είναι: μια σύγκριση είναι έκφραση τύπουbool.Μια σύγκριση είναι μια έκφραση όπως κάθε άλλη: έχει τιμή, τύπουbool, και ηstd::printlnτη γράφει ωςtrueήfalse. Το μάθημα 3.2 ξεκινά από αυτή την παρατήρηση: μια συνθήκη υπολογίζεται, και γι’ αυτό έχει προτεραιότητα, δέντρο και άλγεβρα.Επανάληψη: Σχέσεις και λογική
Ερώτηση 9Μετά τις δηλώσεις
int a{5};καιint b{a++ * 2};, πόσο κάνουν ταaκαιb;Είναι τίμια απάντηση: το μάθημα 3.3 διδάσκει τη διαφορά ανάμεσα στην τιμή μιας έκφρασης και στην επίδρασή της, και η τελική αξιολόγηση θα το ρωτήσει ξανά.Ξεχνά την επίδραση: τοa++αυξάνει τοa.Χρησιμοποιεί τη νέα τιμή τουa· η μεταθεματική αύξηση δίνει την τιμή που υπήρχε πριν.Η έκφρασηa++έχει μια τιμή, εκείνη που είχε τοa(5), και μια επίδραση, που αφήνει τοaστο 6. Το γινόμενο χρησιμοποιεί την τιμή, όχι την επίδραση. Το μάθημα 3.3 διδάσκει πώς ξεχωρίζουμε αυτά τα δύο, και πώς αναγνωρίζουμε πότε δύο επιδράσεις στην ίδια έκφραση την αφήνουν χωρίς σημασία.Επανάληψη: Ανάθεση, παρενέργειες και απροσδιόριστη συμπεριφορά
Ερώτηση 10Τι γράφει η εντολή
std::println("{}", 2 ^ 3);;Είναι τίμια απάντηση: το μάθημα 3.4 το εξηγεί, και η τελική αξιολόγηση θα το ρωτήσει ξανά.Διαβάζει το σύμβολο caret ως δύναμη, όπως στον συμβολισμό πολλών αριθμομηχανών· στη C++ δεν είναι.Το διαβάζει ως γινόμενο.Στη C++ το σύμβολο caret δεν είναι η δύναμη, αλλά το αποκλειστικό Ή bit προς bit: τα και διαφέρουν μόνο στο bit με βάρος 1, ώστε το αποτέλεσμα είναι 1. Η C++ δεν έχει τελεστή δύναμης· το μάθημα 3.4 διδάσκει πότε χρησιμοποιούμε τηstd::powκαι πότε μια ολίσθηση.Επανάληψη: Bit και μαθηματική βιβλιοθήκη
Φόρτωση του περιεχομένου…
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας