1 00:00:00,000 --> 00:00:00,320 2 00:00:00,320 --> 00:00:02,700 >> DAVID J. MALAN: Ας γράψουμε ένα πρόγραμμα σε το οποίο προσπαθούμε να ανταλλάξουν τις αξίες της 3 00:00:02,700 --> 00:00:04,970 δύο μεταβλητές, x και y. 4 00:00:04,970 --> 00:00:07,490 Στην εκ των προτέρων, έχω γράψει πολλά του προγράμματος αυτού έχουν ήδη. 5 00:00:07,490 --> 00:00:11,130 Κατ 'αρχάς, έχω δηλώσει μια μεταβλητή, x, και αποθηκεύστε σε αυτό την αξία, 1. 6 00:00:11,130 --> 00:00:14,120 Στη συνέχεια, δηλώνω μεταβλητή y και αποθηκεύετε σε αυτό το ποσό, 2. 7 00:00:14,120 --> 00:00:17,700 >> Τότε θα προχωρήσει με printf για να εμφανίσετε οι τιμές αυτών των δύο μεταβλητών. 8 00:00:17,700 --> 00:00:21,090 Τότε θα διεκδικήσει με άλλο printf να αλλάζουν αυτές τις μεταβλητές. 9 00:00:21,090 --> 00:00:23,690 Στη συνέχεια, καλώ μια λειτουργία που ονομάζεται swap. 10 00:00:23,690 --> 00:00:26,100 Και τότε ισχυρίζονται ότι οι μεταβλητές έχουν μετατραπεί. 11 00:00:26,100 --> 00:00:30,610 Και τότε θα εκτυπώσετε ότι αυτό που ισχυρίζονται είναι οι νέες τιμές των x και y. 12 00:00:30,610 --> 00:00:32,030 >> Τώρα τι είναι αυτό ανταλλαγής λειτουργία; 13 00:00:32,030 --> 00:00:34,970 Δεν είναι κάτι που έρχεται με C. Πράγματι, αν κοιτάξουμε την κορυφή μου 14 00:00:34,970 --> 00:00:38,850 αρχείο, θα παρατηρήσετε ότι έχω δηλωθεί ένα πρωτότυπο για αυτή την ανταλλαγή λειτουργία 15 00:00:38,850 --> 00:00:42,750 διευκρινίζοντας ότι χρειάζονται δύο ακεραίων, αυθαίρετα ονομάζεται α και β, και αυτό 16 00:00:42,750 --> 00:00:44,300 συνάρτηση δεν επιστρέφει τίποτα. 17 00:00:44,300 --> 00:00:48,370 Έτσι, κατά πάσα πιθανότητα, κάνει ό, τι λέει στις πράξεις μια και οι τιμές του b. 18 00:00:48,370 --> 00:00:50,170 Ας δούμε τώρα την εφαρμογή swap. 19 00:00:50,170 --> 00:00:53,820 >> Κατ 'αρχάς, Πάω να κηρύξει μια προσωρινή μεταβλητή και να εκχωρήσετε σε αυτό 20 00:00:53,820 --> 00:00:57,260 η αξία σε μια περιοχή, αν και θα μπορούσα απλά όπως εύκολα αποθηκεύονται σε αυτό b. 21 00:00:57,260 --> 00:01:00,925 Είμαι στη συνέχεια πρόκειται να αλλάξει την τιμή ενός να είναι ίση προς εκείνη στο b. 22 00:01:00,925 --> 00:01:04,849 Και στη συνέχεια, τέλος, Πάω να αλλάξει η τιμή του b είναι τι ήταν, αλλά είναι 23 00:01:04,849 --> 00:01:06,340 τώρα στο temp. 24 00:01:06,340 --> 00:01:08,910 >> Τώρα μπορώ να ισχυρίζονται ό, τι έχω κάνει ακριβώς είναι λογικά ορθή. 25 00:01:08,910 --> 00:01:12,780 Έχω αποθηκευμένα σε μια προσωρινή μεταβλητή, άλλαξαν τιμή a να είναι b και, στη συνέχεια 26 00:01:12,780 --> 00:01:15,580 αλλάξει τιμή b για να είναι τι ήταν. 27 00:01:15,580 --> 00:01:18,620 Αλλά όταν καταρτίζουν και να τρέξει αυτό πρόγραμμα, φοβάμαι ότι δεν είναι 28 00:01:18,620 --> 00:01:20,140 πηγαίνει ό, τι βλέπω. 29 00:01:20,140 --> 00:01:21,625 >> Κάνετε, δεν swap. 30 00:01:21,625 --> 00:01:24,350 dot κάθετος, δεν swap. 31 00:01:24,350 --> 00:01:27,560 Και δυστυχώς, σύμφωνα με την printf, η τιμή του χ και y, ακόμη 32 00:01:27,560 --> 00:01:31,560 αφού ισχυρίζονται ότι πρέπει να αλλάζουν αυτά, εξακολουθεί να είναι 1 και 2. 33 00:01:31,560 --> 00:01:32,630 >> Τώρα γιατί συμβαίνει αυτό; 34 00:01:32,630 --> 00:01:36,160 Λοιπόν, αποδεικνύεται ότι το κύριο, όταν καλέστε αυτή η αλλαγή λειτουργίας, περνώντας 35 00:01:36,160 --> 00:01:39,960 x και y ως επιχειρήματα, είναι στην πραγματικότητα αντίγραφα των χ και y που 36 00:01:39,960 --> 00:01:41,310 έχουν περάσει σε swap. 37 00:01:41,310 --> 00:01:45,430 Δηλαδή, οι τιμές τους 1 και 2 πέρασε σε ανταλλαγής ως και b. 38 00:01:45,430 --> 00:01:48,590 Και είναι a και b που είμαστε τελικά εναλλαγή στην κύρια. 39 00:01:48,590 --> 00:01:50,810 >> Δηλαδή, 1 γίνεται 2, 2 γίνεται 1. 40 00:01:50,810 --> 00:01:54,630 Αλλά επειδή ανταλλαγής έχει καμία αξία επιστροφή και επειδή έλαβε αντίγραφα των x 41 00:01:54,630 --> 00:01:58,220 και y, είναι η συμπεριφορά έχει καμία επίδραση στην x και y. 42 00:01:58,220 --> 00:02:02,610 Πράγματι, α και β είναι scoped, να το πω έτσι, να ανταλλάξουν, ενώ το x και y παραμένουν 43 00:02:02,610 --> 00:02:03,990 scoped στο κύριο. 44 00:02:03,990 --> 00:02:05,070 >> Έτσι, έχουμε ένα πρόβλημα. 45 00:02:05,070 --> 00:02:06,320 Αλλά πώς μπορεί να διορθωθεί; 46 00:02:06,320 --> 00:02:08,312