1 00:00:00,000 --> 00:00:00,320 2 00:00:00,320 --> 00:00:02,700 >> דוד י מלאן: בואו לכתוב תכנית ב שבו אנו מנסים להחליף את הערכים של 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 זה לא משהו שמגיע עם ג ואכן, אם נסתכל בראש שלי 14 00:00:34,970 --> 00:00:38,850 קובץ, תוכל להבחין כי אני כבר הכריז אב טיפוס עבור החלפת פונקציה זו 15 00:00:38,850 --> 00:00:42,750 ציון שזה לוקח שני ints, באופן שרירותי בשם A ו-B, ואת זה 16 00:00:42,750 --> 00:00:44,300 פונקציה לא מחזירה כלום. 17 00:00:44,300 --> 00:00:48,370 אז ככל הנראה, הוא עושה מה שהוא אומר בעסקות חלף של ערכים ושל ב. 18 00:00:48,370 --> 00:00:50,170 בואו עכשיו ליישם החלפה. 19 00:00:50,170 --> 00:00:53,820 >> ראשית, אני הולך להכריז זמני משתנה ולהקצות לה 20 00:00:53,820 --> 00:00:57,260 הערך ב, למרות שאני רק יכול כלאחסן בקלות בזה ב. 21 00:00:57,260 --> 00:01:00,925 אז אני הולך לשנות את הערך של להיות שווה לזה בסעיף ב '. 22 00:01:00,925 --> 00:01:04,849 ואז לבסוף, אני הולך לשנות את הערך של b להיות מה שהיה, אלא הוא 23 00:01:04,849 --> 00:01:06,340 עכשיו בטמפ '. 24 00:01:06,340 --> 00:01:08,910 >> עכשיו אני טוען את מה שבדיוק עשיתי הוא נכון מבחינה לוגית. 25 00:01:08,910 --> 00:01:12,780 אני כבר מאוחסן במשתנה זמנית, שינה את הערך של להיות ב של, ולאחר מכן 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 >> הפוך, לא החלפה. 30 00:01:21,625 --> 00:01:24,350 נקודת לוכסן, לא החלפה. 31 00:01:24,350 --> 00:01:27,560 ולרוע מזל, על פי printf, את הערך של x ו-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 כטיעונים, זה בעצם עותקים של x ו-y ש 36 00:01:39,960 --> 00:01:41,310 הם עברו להחלפה. 37 00:01:41,310 --> 00:01:45,430 כלומר, הערכים שלהם 1 ו -2 הם עבר להחלפה כמו A ו-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 ואכן, A ו-B 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