>> DAVID J. MALAN: Ας γράψουμε ένα πρόγραμμα σε το οποίο προσπαθούμε να ανταλλάξουν τις αξίες της
δύο μεταβλητές, x και y.
Στην εκ των προτέρων, έχω γράψει πολλά του προγράμματος αυτού έχουν ήδη.
Κατ 'αρχάς, έχω δηλώσει μια μεταβλητή, x, και αποθηκεύστε σε αυτό την αξία, 1.
Στη συνέχεια, δηλώνω μεταβλητή y και αποθηκεύετε σε αυτό το ποσό, 2.
>> Τότε θα προχωρήσει με printf για να εμφανίσετε οι τιμές αυτών των δύο μεταβλητών.
Τότε θα διεκδικήσει με άλλο printf να αλλάζουν αυτές τις μεταβλητές.
Στη συνέχεια, καλώ μια λειτουργία που ονομάζεται swap.
Και τότε ισχυρίζονται ότι οι μεταβλητές έχουν μετατραπεί.
Και τότε θα εκτυπώσετε ότι αυτό που ισχυρίζονται είναι οι νέες τιμές των x και y.
>> Τώρα τι είναι αυτό ανταλλαγής λειτουργία;
Δεν είναι κάτι που έρχεται με C. Πράγματι, αν κοιτάξουμε την κορυφή μου
αρχείο, θα παρατηρήσετε ότι έχω δηλωθεί ένα πρωτότυπο για αυτή την ανταλλαγή λειτουργία
διευκρινίζοντας ότι χρειάζονται δύο ακεραίων, αυθαίρετα ονομάζεται α και β, και αυτό
συνάρτηση δεν επιστρέφει τίποτα.
Έτσι, κατά πάσα πιθανότητα, κάνει ό, τι λέει στις πράξεις μια και οι τιμές του b.
Ας δούμε τώρα την εφαρμογή swap.
>> Κατ 'αρχάς, Πάω να κηρύξει μια προσωρινή μεταβλητή και να εκχωρήσετε σε αυτό
η αξία σε μια περιοχή, αν και θα μπορούσα απλά όπως εύκολα αποθηκεύονται σε αυτό b.
Είμαι στη συνέχεια πρόκειται να αλλάξει την τιμή ενός να είναι ίση προς εκείνη στο b.
Και στη συνέχεια, τέλος, Πάω να αλλάξει η τιμή του b είναι τι ήταν, αλλά είναι
τώρα στο temp.
>> Τώρα μπορώ να ισχυρίζονται ό, τι έχω κάνει ακριβώς είναι λογικά ορθή.
Έχω αποθηκευμένα σε μια προσωρινή μεταβλητή, άλλαξαν τιμή a να είναι b και, στη συνέχεια
αλλάξει τιμή b για να είναι τι ήταν.
Αλλά όταν καταρτίζουν και να τρέξει αυτό πρόγραμμα, φοβάμαι ότι δεν είναι
πηγαίνει ό, τι βλέπω.
>> Κάνετε, δεν swap.
dot κάθετος, δεν swap.
Και δυστυχώς, σύμφωνα με την printf, η τιμή του χ και y, ακόμη
αφού ισχυρίζονται ότι πρέπει να αλλάζουν αυτά, εξακολουθεί να είναι 1 και 2.
>> Τώρα γιατί συμβαίνει αυτό;
Λοιπόν, αποδεικνύεται ότι το κύριο, όταν καλέστε αυτή η αλλαγή λειτουργίας, περνώντας
x και y ως επιχειρήματα, είναι στην πραγματικότητα αντίγραφα των χ και y που
έχουν περάσει σε swap.
Δηλαδή, οι τιμές τους 1 και 2 πέρασε σε ανταλλαγής ως και b.
Και είναι a και b που είμαστε τελικά εναλλαγή στην κύρια.
>> Δηλαδή, 1 γίνεται 2, 2 γίνεται 1.
Αλλά επειδή ανταλλαγής έχει καμία αξία επιστροφή και επειδή έλαβε αντίγραφα των x
και y, είναι η συμπεριφορά έχει καμία επίδραση στην x και y.
Πράγματι, α και β είναι scoped, να το πω έτσι, να ανταλλάξουν, ενώ το x και y παραμένουν
scoped στο κύριο.
>> Έτσι, έχουμε ένα πρόβλημα.
Αλλά πώς μπορεί να διορθωθεί;