דוד י מלאן: בואו לכתוב תכנית ב שבו אנו מנסים להחליף את הערכים של שני משתנים, x ו-y. מראש, שכתבתי הרבה כבר מתכנית זו. ראשית, אני מכריז על משתנה, x, ולאחסן בו את הערך, 1. אז אני מצהיר y משתנה ו לאחסן בו את הערך, 2. אז שאמשיך עם printf להצגה הערכים של שני משתנה אלה. אז אני טוען שעם printf אחר להחלפת משתנים אלה. ואז אני קורא לפונקציה שנקראת swap. ולאחר מכן אני טוען שהמשתנים כבר החליף. ואז להדפיס את מה שאני טוען הם הערכים החדשים של x ו-y. עכשיו מה היא החלפת פונקציה זו? זה לא משהו שמגיע עם ג ואכן, אם נסתכל בראש שלי קובץ, תוכל להבחין כי אני כבר הכריז אב טיפוס עבור החלפת פונקציה זו ציון שזה לוקח שני ints, באופן שרירותי בשם A ו-B, ואת זה פונקציה לא מחזירה כלום. אז ככל הנראה, הוא עושה מה שהוא אומר בעסקות חלף של ערכים ושל ב. בואו עכשיו ליישם החלפה. ראשית, אני הולך להכריז זמני משתנה ולהקצות לה הערך ב, למרות שאני רק יכול כלאחסן בקלות בזה ב. אז אני הולך לשנות את הערך של להיות שווה לזה בסעיף ב '. ואז לבסוף, אני הולך לשנות את הערך של b להיות מה שהיה, אלא הוא עכשיו בטמפ '. עכשיו אני טוען את מה שבדיוק עשיתי הוא נכון מבחינה לוגית. אני כבר מאוחסן במשתנה זמנית, שינה את הערך של להיות ב של, ולאחר מכן שינה את הערך של b להיות מה שהיה של. אבל כשאני לקמפל ולהריץ את זה תכנית, אני חושש שלא הולך מה שאני רואה. הפוך, לא החלפה. נקודת לוכסן, לא החלפה. ולרוע מזל, על פי printf, את הערך של x ו-y, אפילו אחרי שטוענים שהחלפה אותם, הוא עדיין 1 ו -2. עכשיו למה זה? ובכן, מתברר כי בעיקרי, כאשר אנו קורא להחלפה בפונקציה זו, עוברת ב x ו-y כטיעונים, זה בעצם עותקים של x ו-y ש הם עברו להחלפה. כלומר, הערכים שלהם 1 ו -2 הם עבר להחלפה כמו A ו-B. וזה A ו-B שאנחנו בסופו של החלפה בראשית. כלומר, 1 הופך להיות 2, 2 הופך 1. אבל בגלל החלפה אין ערך החזרה ובגלל זה קיבל עותקים של x ו-y, זה התנהגות לא אין כל השפעה על x ו-y. ואכן, A ו-B scoped, כביכול, להחליף, ואילו x ו-y יישארו scoped לעיקרית. אז יש לנו בעיה. אבל איך לתקן את זה?