1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 DOUG LLOYD: เมื่อคุณเริ่มต้น การทำงานร่วมกับฟังก์ชั่น 3 00:00:07,300 --> 00:00:09,966 อีกสิ่งหนึ่งที่เป็นไปได้ที่จะกลายเป็น สำคัญมากที่จะเข้าใจ 4 00:00:09,966 --> 00:00:12,380 ซึ่งเป็นแนวคิดของขอบเขตตัวแปร 5 00:00:12,380 --> 00:00:14,490 ดังนั้นขอบเขตเป็น ลักษณะของตัวแปร 6 00:00:14,490 --> 00:00:18,860 ที่กำหนดจากการที่ฟังก์ชั่น ตัวแปรที่สามารถเข้าถึงได้ 7 00:00:18,860 --> 00:00:24,595 >> มีสองขอบเขตหลักใน C มี ตัวแปรท้องถิ่นและตัวแปรทั่วโลก 8 00:00:24,595 --> 00:00:27,830 ตอนนี้ตัวแปรท้องถิ่นเท่านั้นที่สามารถ เข้าถึงฟังก์ชั่นภายใน 9 00:00:27,830 --> 00:00:29,045 ในการที่พวกเขากำลังสร้าง 10 00:00:29,045 --> 00:00:32,170 พวกเขาไม่สามารถเข้าถึงได้โดยทุกคนอื่น ๆ ฟังก์ชั่นที่มีอยู่ในโปรแกรมของคุณ 11 00:00:32,170 --> 00:00:34,184 เพียงฟังก์ชั่นใน ที่มันถูกสร้างขึ้น 12 00:00:34,184 --> 00:00:36,350 ตัวแปรทั่วโลกบน มืออื่น ๆ ที่สามารถเข้าถึงได้ 13 00:00:36,350 --> 00:00:37,719 โดยฟังก์ชั่นใด ๆ ในโปรแกรม 14 00:00:37,719 --> 00:00:40,260 และเหตุผลที่ว่าเป็น เพราะพวกเขาไม่ได้สร้างขึ้นภายใน 15 00:00:40,260 --> 00:00:41,441 โดยเฉพาะอย่างยิ่งของการทำงานใด ๆ 16 00:00:41,441 --> 00:00:43,690 เราขอประกาศให้พวกเขาที่ด้านนอกของ ทุกฟังก์ชั่ซึ่ง 17 00:00:43,690 --> 00:00:48,940 หมายความว่าทุกฟังก์ชั่นรู้ว่า มันคืออะไรและสามารถเข้าถึงและจัดการกับมัน 18 00:00:48,940 --> 00:00:52,010 >> เพื่อให้ห่างไกลในหลักสูตรที่คุณได้สวย รับเฉพาะการทำงานมาก 19 00:00:52,010 --> 00:00:54,280 กับตัวแปรท้องถิ่น 20 00:00:54,280 --> 00:00:58,320 นี่คือตัวอย่างของมากมาก ฟังก์ชั่นหลักที่เรียบง่ายและง่ายมาก 21 00:00:58,320 --> 00:01:00,680 ฟังก์ชั่นเพิ่มเติมที่เราได้เขียน 22 00:01:00,680 --> 00:01:03,180 ในกรณีนี้, x ซึ่ง ฉันได้สีเขียวเพียง 23 00:01:03,180 --> 00:01:07,400 เพื่อเน้นบริเวณใกล้เคียงหรือ ขอบเขตของตัวแปรนั้น 24 00:01:07,400 --> 00:01:09,240 เป็นท้องถิ่นเพื่อฟังก์ชั่นที่สาม 25 00:01:09,240 --> 00:01:12,300 หลักไม่สามารถดู x เลย 26 00:01:12,300 --> 00:01:14,259 มันไม่ได้รู้ว่าสิ่งที่มันเป็น 27 00:01:14,259 --> 00:01:17,050 ไม่มีฟังก์ชั่นอื่น ๆ ที่ในความเป็นจริงถ้าเรา มีฟังก์ชั่นเพิ่มเติมในที่นี่ 28 00:01:17,050 --> 00:01:19,360 อาจจะหมายถึง x 29 00:01:19,360 --> 00:01:23,520 >> ในทำนองเดียวกันผลที่ฉันได้ สีฟ้ามีในท้องถิ่นเท่านั้นที่จะเป็นหลัก 30 00:01:23,520 --> 00:01:26,980 เพียง แต่รู้ว่าสิ่งที่สำคัญ ผลตัวแปร 31 00:01:26,980 --> 00:01:30,010 สามไม่สามารถใช้งานได้ 32 00:01:30,010 --> 00:01:32,580 >> ตอนนี้ที่ผมกล่าวถึง, ตัวแปรทั่วโลกทำอยู่ 33 00:01:32,580 --> 00:01:35,575 ถ้าคุณกำหนดตัวแปรที่ ด้านนอกของฟังก์ชั่นใด ๆ 34 00:01:35,575 --> 00:01:38,290 ทุกฟังก์ชั่ใน โปรแกรมที่สามารถเรียกมัน 35 00:01:38,290 --> 00:01:44,010 ดังนั้นในกรณีนี้ผมได้เน้นใน สีเขียวประกาศตัวแปรทั่วโลก 36 00:01:44,010 --> 00:01:45,830 ในกรณีนี้ เป็นตัวแปรที่ประกาศ 37 00:01:45,830 --> 00:01:48,720 เรียกว่าทั่วโลกเพียงเพื่อ เป็นอย่างมากที่ชัดเจนเกี่ยวกับเรื่องนี้ 38 00:01:48,720 --> 00:01:49,720 มันเป็นลอยประเภท 39 00:01:49,720 --> 00:01:52,940 และผมกำหนดค่า 0.5050 40 00:01:52,940 --> 00:01:58,080 >> คุณจะสังเกตเห็นว่าในหลักและใน สามผมก็สามารถที่จะอ้างถึงทั่วโลก 41 00:01:58,080 --> 00:02:03,480 และในความเป็นจริงถ้าผมไปผ่านทางโปรแกรม ตามที่ระบุสายแรกหลักสาม 42 00:02:03,480 --> 00:02:10,440 สามคูณทั่วโลกโดย 3 ซึ่ง ตั้งค่าเป็น 1.5 บางสิ่งบางอย่าง 43 00:02:10,440 --> 00:02:16,080 1.51 หรือสิ่งที่ต้องการและ แล้วที่สำคัญยังพิมพ์ออกค่า 44 00:02:16,080 --> 00:02:16,620 ของทั่วโลก 45 00:02:16,620 --> 00:02:24,424 ดังนั้นหลักจะไม่พิมพ์ออก 0.5050 มัน จะพิมพ์ออกมาทั่วโลกครั้งที่ 3 1.51 46 00:02:24,424 --> 00:02:27,340 เพื่อให้คุณได้มีการระมัดระวังในการ คุณกำลังทำงานกับตัวแปรทั่วโลก 47 00:02:27,340 --> 00:02:30,260 ในขณะที่พวกเขากำลังมีความยืดหยุ่นมากใน ความสามารถในการส่งผ่านข้อมูล 48 00:02:30,260 --> 00:02:32,650 รอบเพื่อให้ทุก ฟังก์ชั่นที่สามารถใช้งานได้ 49 00:02:32,650 --> 00:02:34,580 ก็ยังสามารถมีบางส่วน ผลกระทบที่เป็นอันตราย 50 00:02:34,580 --> 00:02:38,770 หากมีการเปลี่ยนแปลงการทำงาน ค่าของตัวแปร 51 00:02:38,770 --> 00:02:42,360 ก่อนที่คุณจะคาดหวังว่ามันจะมีการเปลี่ยนแปลง 52 00:02:42,360 --> 00:02:44,200 >> เรื่องความแตกต่างนี้ทำไม? 53 00:02:44,200 --> 00:02:48,070 ทำไมเราสนใจว่าตัวแปรบาง มีในท้องถิ่นและอื่น ๆ ทั่วโลกหรือไม่ 54 00:02:48,070 --> 00:02:53,880 ดีส่วนใหญ่ตัวแปรท้องถิ่น ใน C มีสิ่งที่เรียกว่าผ่านค่า 55 00:02:53,880 --> 00:02:56,087 เมื่อเราทำการเรียกฟังก์ชั่น 56 00:02:56,087 --> 00:02:56,920 นั่นหมายความว่าอย่างไร? 57 00:02:56,920 --> 00:03:00,880 >> ดีเมื่อตัวแปรจะถูกส่ง โดยค่า callee ซึ่ง 58 00:03:00,880 --> 00:03:04,350 เป็นวิธีการบอกว่าฟังก์ชั่นอื่น ที่ได้รับตัวแปรที่ 59 00:03:04,350 --> 00:03:08,465 ได้รับการส่งผ่านไปในขณะที่ใส่ก็จริง ไม่ได้รับตัวแปรตัวเองว่า 60 00:03:08,465 --> 00:03:12,490 ได้รับของตัวเอง สำเนาของมันในการทำงานกับ 61 00:03:12,490 --> 00:03:14,350 นี่คือความแตกต่างที่สำคัญจริงๆ 62 00:03:14,350 --> 00:03:18,250 เราเพิ่งเห็นที่สองที่ผ่านมา กับตัวแปรที่ทั่วโลก 63 00:03:18,250 --> 00:03:23,240 ถ้าเราจัดการกับโลก ตัวแปรหนึ่งในฟังก์ชั่นที่มีผล 64 00:03:23,240 --> 00:03:26,390 ในการที่ดำเนินการอย่างใดอย่างหนึ่งฟังก์ชั่น ผ่านไปยังทุกฟังก์ชั่นอื่น ๆ 65 00:03:26,390 --> 00:03:28,920 >> แต่ด้วยตัวแปรท้องถิ่น ที่ไม่เป็นความจริง. 66 00:03:28,920 --> 00:03:32,060 ฟังก์ชั่นเมื่อแต่ละคน ได้รับตัวแปรเป็น input 67 00:03:32,060 --> 00:03:36,367 ได้รับสำเนาของตัวแปรเหล่านั้น ไม่ตัวแปรของตัวเอง 68 00:03:36,367 --> 00:03:37,825 ดังนั้นสิ่งที่เป็นผลข้างเคียงของที่? 69 00:03:37,825 --> 00:03:40,450 นั่นหมายความว่าตัวแปรใน โทรฟังก์ชั่นที่ 70 00:03:40,450 --> 00:03:45,600 เป็นฟังก์ชั่นการโทรเป็น ไม่เปลี่ยนแปลงจนกว่าคุณจะแทนที่ 71 00:03:45,600 --> 00:03:50,420 >> ยกตัวอย่างเช่นในรหัสนี้ foo จะไม่เปลี่ยนแปลงเลย 72 00:03:50,420 --> 00:03:55,450 int foo เท่ากับ 4 โทรสาม ของ foo ภายในของสาม 73 00:03:55,450 --> 00:03:58,850 เราจะคาดหวังว่าจะ foo คูณด้วย 3 และกลับ 74 00:03:58,850 --> 00:04:01,450 แต่มีจริงไม่มีผลกระทบ 75 00:04:01,450 --> 00:04:03,460 >> ที่นี่ แต่ความแตกต่างที่ลึกซึ้งมาก 76 00:04:03,460 --> 00:04:06,520 นี้จะมีผลกระทบที่เราต้องการ 77 00:04:06,520 --> 00:04:07,730 คุณเห็นว่าทำไม? 78 00:04:07,730 --> 00:04:11,500 เรากำลังเอาชนะฟูหลักในเวลานี้ 79 00:04:11,500 --> 00:04:16,899 >> ดังนั้น int foo เท่ากับ 4 foo เท่ากับ สาม foo เมื่อเราโทรที่ 80 00:04:16,899 --> 00:04:21,680 สามได้รับสำเนาของตัวเอง ของ foo สำเนาของตัวเองของ 4 81 00:04:21,680 --> 00:04:27,340 มันบอกว่ากลับมา 4 ครั้งที่ 3 หรืออะไรก็ตาม ตัวแปรที่ได้รับผ่านในครั้งที่ 3 82 00:04:27,340 --> 00:04:32,109 และจากนั้นเรากำหนดผลตอบแทน ค่าของสามเพื่อ foo อีกครั้ง 83 00:04:32,109 --> 00:04:33,650 ดังนั้นนี้จริงจะเขียนทับ foo 84 00:04:33,650 --> 00:04:35,816 วิธีนี้เป็นวิธีเดียวที่จะทำ นี้กับตัวแปรท้องถิ่น 85 00:04:35,816 --> 00:04:38,120 ดังนั้นถ้าเราเพิ่มอีก บรรทัดของรหัสที่นี่ 86 00:04:38,120 --> 00:04:40,870 ในตอนท้ายของหลักไป พิมพ์ค่าของ foo ที่ 87 00:04:40,870 --> 00:04:45,030 มันจะในความเป็นจริง 12 พิมพ์ออกมา 88 00:04:45,030 --> 00:04:48,600 >> ขอบเขตตัวแปรโดยทั่วไป ไม่มากเกินไปของปัญหา 89 00:04:48,600 --> 00:04:51,190 ถ้าคุณชื่อทั้งหมดของคุณ ตัวแปรสิ่งที่แตกต่าง 90 00:04:51,190 --> 00:04:54,920 แต่ก็สามารถได้รับชนิดของที่น่ารังเกียจ ถ้าชื่อตัวแปรเดียวกัน 91 00:04:54,920 --> 00:04:58,820 ปรากฏในฟังก์ชั่นหลาย ซึ่งจะเกิดขึ้นเป็นจำนวนมาก 92 00:04:58,820 --> 00:05:02,130 ถ้าคุณเคยทำผลงานใน โลกแห่งความจริงที่ 93 00:05:02,130 --> 00:05:06,080 คุณกำลังทำงานในการทำงานร่วมกัน โปรแกรมและคนที่อยู่ในทีมงานที่แตกต่างกัน 94 00:05:06,080 --> 00:05:11,000 จะทำงานร่วมกันในการเขียนเดียวกัน โปรแกรมหรือชุดเดียวกันของโปรแกรม 95 00:05:11,000 --> 00:05:13,900 พวกเขามักจะนำมาใช้ตัวแปร ชื่อคนทั่วไปโดยเฉพาะอย่างยิ่ง 96 00:05:13,900 --> 00:05:18,020 เช่น x, y, ฉัน j และอื่น ๆ 97 00:05:18,020 --> 00:05:20,370 >> แต่เมื่อมีตัวแปร ชื่อเดียวกันประเด็นขอบเขต 98 00:05:20,370 --> 00:05:23,080 จะได้รับเพียงเล็กน้อย trickier ที่จะแยก 99 00:05:23,080 --> 00:05:26,790 ตัวอย่างเช่นคุณจะรู้ว่า สิ่งที่จะพิมพ์ออกมา 100 00:05:26,790 --> 00:05:30,190 ในตอนท้ายของโปรแกรมนี้โดยเฉพาะหรือไม่ 101 00:05:30,190 --> 00:05:31,280 ใช้เวลาสักครู่ 102 00:05:31,280 --> 00:05:33,382 หยุดวิดีโอและอ่าน ผ่านโปรแกรมนี้ 103 00:05:33,382 --> 00:05:35,590 คุณสามารถดูได้ที่เราด้านบน มีฟังก์ชั่นการประกาศ 104 00:05:35,590 --> 00:05:37,350 สำหรับฟังก์ชั่นที่เรียกว่าเพิ่มขึ้น 105 00:05:37,350 --> 00:05:40,800 ฟังก์ชั่นที่ใช้เวลาเดียว พารามิเตอร์จำนวนเต็มซึ่งเราเรียก x 106 00:05:40,800 --> 00:05:42,610 และมันจะออกผลลัพธ์เป็นจำนวนเต็ม 107 00:05:42,610 --> 00:05:44,820 นั่นเป็นชนิดกลับที่จุดเริ่มต้น 108 00:05:44,820 --> 00:05:48,140 >> แล้วเรามีหลักคู่สาย ของรหัสในหลักสุดท้ายที่ 109 00:05:48,140 --> 00:05:49,250 เป็นคำสั่งการพิมพ์ 110 00:05:49,250 --> 00:05:51,140 และจำไว้ว่าเป็นคำถามที่นี่ 111 00:05:51,140 --> 00:05:54,240 สิ่งที่เป็นจริงไปได้ พิมพ์ในตอนท้ายของฟังก์ชั่นนี้หรือไม่? 112 00:05:54,240 --> 00:05:58,110 และจากนั้นเราจะมี ความหมายของการเพิ่มขึ้นดังต่อไปนี้ 113 00:05:58,110 --> 00:06:01,760 >> เพื่อใช้นาทีก้าวผ่าน รหัสติดตามสิ่งที่ออก 114 00:06:01,760 --> 00:06:08,100 คุณรู้ว่าสิ่งที่จะได้รับการพิมพ์ที่ไม่ ในตอนท้ายของโปรแกรมนี้โดยเฉพาะหรือไม่ 115 00:06:08,100 --> 00:06:08,600 >> ทั้งหมดขวา 116 00:06:08,600 --> 00:06:11,433 หวังว่าคุณได้ถ่ายไม่กี่วินาที และพยายามแยกนี้ออก 117 00:06:11,433 --> 00:06:13,370 ขอทำมันด้วยกัน. 118 00:06:13,370 --> 00:06:16,022 >> ดังนั้นผมจึงได้เดินออกที่เพิ่มขึ้นของ ประกาศที่ด้านบนมี 119 00:06:16,022 --> 00:06:17,230 มันเป็นชนิดของสิ่งที่ทำให้ไขว้เขว 120 00:06:17,230 --> 00:06:18,570 มันไม่ได้เป็นตัวแปรของตัวเอง 121 00:06:18,570 --> 00:06:19,879 แต่ไม่ได้มีขอบเขตของตัวเอง 122 00:06:19,879 --> 00:06:21,920 มันเป็นเพียงฟังก์ชั่น ประกาศแล้วดังนั้นจุดประสงค์ 123 00:06:21,920 --> 00:06:24,330 การพยายามที่จะแยกออกว่ามีอะไร ที่เกิดขึ้นในโปรแกรมนี้ 124 00:06:24,330 --> 00:06:26,660 เราอาจมีเพียงหลีกเลี่ยงได้ 125 00:06:26,660 --> 00:06:29,560 >> ตอนนี้เรามีในกรณีนี้ เหตุผลที่ปัญหานี้เป็นเรื่องยุ่งยาก 126 00:06:29,560 --> 00:06:34,030 เป็นเพราะเรามีตัวแปรท้องถิ่นใน ทั้งหลักและเพิ่มขึ้นแต่ละที่ 127 00:06:34,030 --> 00:06:35,090 เรียกว่า x 128 00:06:35,090 --> 00:06:39,830 และแน่นอนปมของปัญหานี้คือ พยายามที่จะรู้ทันเหตุการณ์ที่ x ได้รับการเปลี่ยนแปลง 129 00:06:39,830 --> 00:06:41,890 และวิธีการที่ไม่ได้รับการเปลี่ยนแปลง 130 00:06:41,890 --> 00:06:46,900 ดังนั้นผมจึงได้สีทุกกรณี ของ x ที่ท้องถิ่นเป็นสีแดงเป็นหลัก 131 00:06:46,900 --> 00:06:52,040 และฉันได้เช่นสีของทุก x ที่ท้องถิ่นเพื่อเพิ่มสีฟ้า 132 00:06:52,040 --> 00:06:55,220 >> แจ้งให้ทราบว่าในบรรทัดที่สาม ของหลัก, y เท่ากับเพิ่มขึ้น 133 00:06:55,220 --> 00:07:00,800 x เพิ่มขึ้นที่ไม่ได้เป็น ผ่านหลัก x หรือ x สีแดง 134 00:07:00,800 --> 00:07:03,320 มันได้รับการผ่านสำเนาของมัน 135 00:07:03,320 --> 00:07:06,987 และมันเท่านั้นจะได้ทำงานร่วมกับ ว่าสำเนาของมันสีฟ้า x 136 00:07:06,987 --> 00:07:08,820 หากคุณคณิตศาสตร์ ความโน้มเอียงที่คุณอาจ 137 00:07:08,820 --> 00:07:14,230 มีความคิดแทนนี้เป็น x ย่อย เมตรสำหรับย่อยหลักและ x เพิ่มขึ้นสำหรับฉัน 138 00:07:14,230 --> 00:07:15,700 แต่มันเป็นความคิดเดียวกัน 139 00:07:15,700 --> 00:07:18,999 ม. x ย่อยหรือสีแดง x ในสไลด์ก่อนหน้านี้ 140 00:07:18,999 --> 00:07:21,790 เป็นตัวแปรที่มี local-- เป็นตัวอย่างของ x ค่อนข้างว่า 141 00:07:21,790 --> 00:07:26,900 เป็นท้องถิ่นที่จะหลักและย่อยฉัน x หรือ ตัวแปรสีฟ้าในสไลด์ก่อนหน้านี้ 142 00:07:26,900 --> 00:07:30,760 กรณีของ x ที่ มีในท้องถิ่นเพื่อเพิ่ม 143 00:07:30,760 --> 00:07:36,220 >> ดังนั้นเป็นคุณสามารถที่จะคิดออกว่า ฟังก์ชั่นนี้พิมพ์ที่สิ้นสุดหรือไม่ 144 00:07:36,220 --> 00:07:39,420 ฉันลอยด์ดั๊กและนี่คือ CS50 145 00:07:39,420 --> 00:07:41,542