[Παίζει μουσική] DOUG LLOYD: Εντάξει. Είδος ένα παράξενο θέμα, σωστά; Magic αριθμοί. Τι ελαφίνα που εννοούμε όταν αυτός είναι μιλάμε για τη μαγεία τους αριθμούς; Λοιπόν, ορισμένα από τα προγράμματα ότι έχουμε γράψει σε CS50 μέχρι τώρα είχαν κάποια περίεργα αριθμούς είδους ρίχνονται σε αυτά. Ίσως για λόγους που δεν εξ ολοκλήρου καταλάβουν τώρα. Για παράδειγμα, το πρόβλημα Mario, εμείς ανώτατο όριο το ύψος της πυραμίδας στο 23. Σας είπε ρητά δεν μπορεί να υπερβεί το 23. Αλλά τι σημαίνει 23; Λοιπόν, αν έχετε διαβάσει το spec σας προσεκτικά, θα μπορούσε να φανεί ότι η λόγος για τον οποίο το ανώτατο όριο σε 23 επειδή είναι το κανονικό ύψος από ένα παράθυρο τερματικού είναι 24. Και έτσι αν έχουμε το πυραμίδα είναι ψηλότερο από αυτό, θα μπορούσε να κάνει αυτό το περίεργο πράγμα όπου τρέχει από την οθόνη. Και ξέρετε, τι κάνει αυτό σημαίνει ότι σε αυτό το πλαίσιο, έτσι δεν είναι; Είναι το νόημα της 23ης αμέσως προφανές σε κάποιον που κοιτάζει το πρόγραμμά σας και ίσως έχει μια διαφορετική παράθυρο τερματικού μέγεθος; Πιθανώς όχι. Φαίνεται σαν, ΟΚ. Λοιπόν, γιατί είναι λίγο λιγότερο από 23; Σε γενικές γραμμές, αυτό είναι το είδος από μια κακή συνήθεια πραγματικότητα να γράψει σε σταθερές κωδικό σας. Με τον τρόπο αυτό, όταν το κάνετε πραγματικά Αποστολή σε σταθερή κωδικό σας, είναι μερικές φορές αναφέρεται ως χρησιμοποιώντας μαγικοί αριθμοί, το οποίο είναι κάτι που γενικά θέλουν να προσπαθήσει και να αποφύγει. Για παράδειγμα, ας ρίξουμε μια ματιά σε αυτή την απλή λειτουργία εδώ. Προφανώς δεν υπάρχουν στοιχεία τύπου C που ονομάζεται κάρτα ή κατάστρωμα. Έτσι απλά να φέρει μαζί μου. Είναι ένα μικρό κομμάτι της pseudocode αναμιγνύονται εδώ. Αυτή είναι μια λειτουργία που ονομάζεται ασχοληθεί κάρτα που προφανώς παίρνει ένα κατάστρωμα ως παράμετρο, και βούληση εξόδου για μένα μια ενιαία κάρτα. Και κάνω κάτι εδώ όπου έχουν έναν βρόχο που τρέχει 0-52, και ασχολούμαι κάρτα. Λοιπόν, έχουμε μια μαγική αριθμό εδώ, σωστά. Βλέπετε τι ο μαγικός αριθμός είναι; Ή το πιο σημαντικό, να κάνετε δείτε ποιο είναι το πρόβλημα εδώ; Ιδιαίτερα εάν αυτό είναι μόνο μια λειτουργία στο δικό της αρχείο σε ένα φάκελο που περιέχει μια δέσμη των διαφορετικών αρχεία, καθένα από τα οποία κάνει άλλο πράγμα σε μια τράπουλα. Ίσως να τους ανακατεύει, ή ασχολείται ένα χέρι πέντε κάρτες αντί για μία μόνο κάρτα. Βλέπετε τι το το πρόβλημα θα μπορούσε να είναι εδώ; Βλέπετε το μαγικό αριθμό Έχω εγχέεται στον κώδικα; Είναι 52, δεξιά. Όπως, διαισθητικά ίσως γνωρίζετε, εντάξει. Όπως μια τράπουλα κάρτες περιέχει 52 φύλλα. Αλλά στο πρόγραμμά μας, είναι ακριβώς είδος που επιπλέουν γύρω εκεί. Είναι σαν ξαφνικά υπάρχει ένα 52. Ένας τρόπος για να επιλύσετε αυτό το πρόβλημα είναι να το κάνουμε αυτό. Είμαστε πολύ ρητώς τώρα καλώντας το μέγεθος καταστρώματος, όπως 52. Δίνει λίγο πιο διαισθητικό που σημαίνει ότι όταν ο βρόχος for Αργότερα στη συνέχεια να πω, εγώ είναι μικρότερο από το μέγεθος του καταστρώματος. Φαίνεται λίγο καλύτερα από ό, τι λέει 52. Τώρα αυτό δεν διορθώσει το πρόβλημα στην πραγματικότητα. Αυτό δίνει κάποια συμβολική νόημα στη σταθερή. Αλλά το κάνει πραγματικότητα το είδος του εισαγάγει ένα άλλο πρόβλημα ότι μπορεί να μην είναι άμεσα εμφανής. Ακόμη και αν αυτή η μεταβλητή δηλώνεται globally-- Θυμάσαι τι σημαίνει ότι όταν δηλώνουμε μια μεταβλητή σε παγκόσμιο επίπεδο σε σχέση με τοπικά; Ακόμα κι αν δηλώνουμε μια μεταβλητή σε παγκόσμιο επίπεδο, τι εάν υπάρχει μια άλλη λειτουργία σουίτα μας λειτουργιών που ασχολούνται με το χειρισμό της κάρτας ότι αλλάζει ακούσια μέγεθος καταστρώματος, ή να αυξάνει από 1 ή μειώνεται κατά 1. Αυτό θα μπορούσε να σημάνει πρόβλημα, σωστά; Ειδικά αν έχουμε να κάνουμε με ένα σετ των καρτών, όπου το ανακάτεμα πλήρες κατάστρωμα απαιτείται. Εάν το μέγεθος του καταστρώματος μειώνεται με 1, για παράδειγμα, για 51, δεν είμαστε στην πραγματικότητα το ανακάτεμα όλες οι κάρτες πιθανώς. Φεύγουμε από έναν από τους έξω. Και η αξία μπορούσε ίσως να είναι προβλέψει ή να αξιοποιούνται από μια κακή ηθοποιό. C παρέχει ό, τι λέγεται οδηγία προεπεξεργαστή, η οποία καλείται επίσης μια μακροεντολή για δημιουργώντας συμβολική σταθερές. Και στην πραγματικότητα, έχετε ήδη δει μια οδηγία προεπεξεργαστή, ακόμη και αν δεν το έχετε ακούσει που ονομάζεται ότι με #include. Είναι άλλο ένα παράδειγμα ενός μακρο ή οδηγία προεπεξεργαστή. Ο τρόπος για να δημιουργήσετε συμβολικό σταθερές, ή δίνοντας ένα όνομα σε ένα σταθερό έτσι ώστε να έχει περισσότερη έννοια, έχει ως εξής. #define, το όνομα, την αντικατάσταση. Πραγματικά σημαντικό μέρος Εδώ πραγματικά γρήγορα. Μην βάζετε ένα ερωτηματικό στο το τέλος του #defines σας. Έτσι είναι #define, το όνομα, την αντικατάσταση. Όταν το πρόγραμμα έχει συνταχθεί, τι συμβαίνει στην πραγματικότητα είναι ο compiler, αν πρόκειται να περάσει μέσα από τον κωδικό σας και να αντικαταστήσει κάθε περίπτωση η λέξη "όνομα", με ό, τι θέσει ως αντικατάσταση. Κατ 'αναλογία, αν #include είναι είδος παρόμοιων με αντιγραφή και επικόλληση, τότε #define είναι το είδος του παρόμοιο με βρείτε και να αντικαταστήσετε, αν έχετε χρησιμοποιήσει ποτέ αυτό το χαρακτηριστικό σε ένα πρόγραμμα επεξεργασίας κειμένου, για παράδειγμα. Έτσι, για παράδειγμα, αν #define pi όπως 3.14159265, αν είστε σε καλύτερη μαθηματικά κλίση και ξαφνικά δείτε 3.14159265 φέρουν γύρω στον κώδικά σας, ίσως γνωρίζετε ότι μιλάει πίν. Αλλά ίσως μπορούμε να δώσουμε μια λίγο περισσότερο συμβολική σημασία. Και μπορούμε να πούμε αντί #define pi ως εκείνη μπουκιά αριθμών ότι δεν πρόκειται να κρατήσω διαβάζοντας ξανά και ξανά. Και τι πρόκειται να συμβεί στη συνέχεια σε τη διάρκεια της μεταγλώττισης είναι όταν το πρόγραμμα είναι καταρτίζονται, το πρώτο πράγμα που θα συμβεί είναι ότι θα περάσει και θα αντικαταστήσει κάθε φορά βλέπει κεφάλαιο P, κεφάλαιο Ι, αυτό θα το αντικαταστήσει κυριολεκτικά με 3.14 και ούτω καθεξής, έτσι ώστε να Δεν χρειάζεται να πληκτρολογήσετε το κάθε το χρόνο, ενώ το πρόγραμμα εξακολουθεί να έχει τη λειτουργικότητα που Αναμένουμε, επειδή εργάζεστε με το χειρισμό, τον πολλαπλασιασμό, διαίρεση, ό, τι είναι από πίν. Δεν περιορίζονται σε αυτό αντικατάσταση μόνο αριθμούς. Για παράδειγμα, θα μπορούσα να #define Φυσικά, όπως το CS50 κορδόνι. Στην περίπτωση αυτή, όταν η πρόγραμμα καταρτίζεται, #define θα περάσουν από το κώδικας, αντικαταστήστε κάθε φορά βλέπει "μάθημα" με τον CS50 κορδόνι. Θα παρατηρήσετε εδώ επίσης ότι συχνά #define ορίζονται όλα μου συμβολική σταθερές, να το πω έτσι, είναι πάντα σε όλα τα καλύμματα. Είναι μια σύμβαση. Δεν απαιτείται. Ο λόγος γενικά οι άνθρωποι θα χρησιμοποιήσουν όλες οι πρωτεύουσες όταν είναι #defining Είναι ακριβώς για να είναι πραγματικά σαφές ότι Αυτό το συγκεκριμένο στοιχείο του κωδικού μου είναι μια καθορισμένη σταθερή. Αν ήταν πεζά, είναι πιθανό ότι θα μπορούσε να συγχέεται με μια μεταβλητή. Και αυτό είναι πιθανώς δεν είναι ένα καλό πράγμα που κάνει. Έτσι, η συγκεκριμένη διάλυμα είναι πολύ καλύτερη από οποιοδήποτε από τα προηγούμενα. Αν ήμουν πρώτη #define μέγεθος καταστρώματος 52, στη συνέχεια, τώρα μου χρήση του 52, ή το μέγεθος του καταστρώματος εδώ, είναι πολύ πιο έξυπνο και πολύ πιο ασφαλής. Δεν μπορείτε να χειριστείτε ένα σταθερό. Δεν μπορούμε να πούμε 52 συν συν. Αυτό δεν πρόκειται να το μετατρέψετε σε 53. Δεν μπορείτε να αλλάξετε 52 σε κάτι. Μπορείτε να αλλάξετε μια μεταβλητή των οποίων η αξία είναι 52, η οποία ήταν η πρώτη λύση που είχαμε πριν. Και θα μπορούσε να αυξήσει ότι οι μεταβλητές έως 53. Αλλά δεν μπορούμε να πούμε 52 συν συν και πρέπει να μετατραπεί ξαφνικά σε 52 53. 52 είναι πάντα 52. Και έτσι δεν μπορείτε να αλλάξετε κατά λάθος μέγεθος κατάστρωμα εδώ με το χειρισμό αυτό, Μια άλλη καλή πλευρά αποτέλεσμα αυτής είναι όμως που γνωρίζετε ότι δεν όλες οι χώρες σε όλο τον κόσμο χρησιμοποιήστε μια τράπουλα μεγέθους 52; Για παράδειγμα, είναι πολύ συχνές σε Γερμανία να χρησιμοποιήσετε ένα μέγεθος κατάστρωμα 32, όπου βγαίνουν έξω μερικά των χαμηλότερων κάρτες αξίας. Και σε αυτή την περίπτωση, ήθελαν να μεταφέρουν σουίτα μου των λειτουργιών που ασχολούνται με χειραγώγηση της κάρτας στη Γερμανία. Θα μπορούσα σε πρώτη φάση θα έδειξε, πρέπει να πάμε και να αντικαταστήσετε όλες οι παρουσίες του 52 στον κώδικά μου με 32. Αλλά εδώ, αν μου #define μέγεθος κατάστρωμα ως 32 στην κορυφή του κωδικού μου, αν χρειαστεί να το αλλάξετε, μπορώ απλά πηγαίνετε και να αλλάξετε αυτό το ένα πράγμα. Επαναμεταγλωττίστε τον κωδικό μου, και όλοι μια ξαφνική διαδίδεται μέσω του. Στην πραγματικότητα, μπορούμε να αλλάξουμε το κατάστρωμα μέγεθος σε οποιαδήποτε τιμή θέλουμε. Μπορώ να σας ενδιαφέρουν σε μια παιχνίδι του μεγέθους κατάστρωμα pickup; Είμαι ο Νταγκ Lloyd. Και αυτό είναι CS50.