1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 DOUG LLOYD: Seperti yang anda mula bekerja dengan fungsi, 3 00:00:07,300 --> 00:00:09,966 perkara yang lain akan menjadi benar-benar penting untuk memahami, 4 00:00:09,966 --> 00:00:12,380 yang merupakan konsep skop berubah-ubah. 5 00:00:12,380 --> 00:00:14,490 Jadi skop ialah ciri pembolehubah 6 00:00:14,490 --> 00:00:18,860 yang mentakrifkan yang fungsi pembolehubah yang boleh diakses. 7 00:00:18,860 --> 00:00:24,595 >> Terdapat dua skop utama dalam C, pembolehubah tempatan dan pembolehubah global. 8 00:00:24,595 --> 00:00:27,830 Sekarang, pembolehubah tempatan hanya boleh diakses dalam fungsi 9 00:00:27,830 --> 00:00:29,045 di mana mereka diwujudkan. 10 00:00:29,045 --> 00:00:32,170 Mereka tidak boleh diakses oleh setiap lain fungsi yang wujud dalam program anda, 11 00:00:32,170 --> 00:00:34,184 hanya fungsi dalam mana ia dibuat. 12 00:00:34,184 --> 00:00:36,350 Pembolehubah global, pada Sebaliknya, boleh diakses 13 00:00:36,350 --> 00:00:37,719 oleh mana-mana fungsi dalam program ini. 14 00:00:37,719 --> 00:00:40,260 Dan sebab itulah kerana mereka tidak dicipta di dalam 15 00:00:40,260 --> 00:00:41,441 apa-apa fungsi tertentu. 16 00:00:41,441 --> 00:00:43,690 Kami mengaku mereka di luar semua fungsi, yang 17 00:00:43,690 --> 00:00:48,940 bermakna setiap fungsi tahu di mana ia adalah dan boleh mengakses dan memanipulasi ia. 18 00:00:48,940 --> 00:00:52,010 >> Setakat ini dalam perjalanan anda sudah cukup banyak telah bekerja secara eksklusif 19 00:00:52,010 --> 00:00:54,280 dengan pembolehubah tempatan. 20 00:00:54,280 --> 00:00:58,320 Berikut adalah satu contoh yang sangat, sangat Fungsi utama yang ringkas dan sangat mudah 21 00:00:58,320 --> 00:01:00,680 fungsi tambahan yang kita telah menulis. 22 00:01:00,680 --> 00:01:03,180 Dalam kes ini, x, yang Saya berwarna hijau hanya 23 00:01:03,180 --> 00:01:07,400 untuk menyerlahkan kawasan itu atau skop pembolehubah yang, 24 00:01:07,400 --> 00:01:09,240 adalah tempatan untuk majlis itu tiga kali ganda. 25 00:01:09,240 --> 00:01:12,300 utama tidak boleh merujuk kepada x sama sekali. 26 00:01:12,300 --> 00:01:14,259 Ia tidak tahu apa yang ada. 27 00:01:14,259 --> 00:01:17,050 Tiada fungsi lain, sebenarnya, jika kita mempunyai fungsi tambahan di sini, 28 00:01:17,050 --> 00:01:19,360 boleh merujuk kepada x. 29 00:01:19,360 --> 00:01:23,520 >> Begitu juga, keputusan yang saya telah berwarna biru, adalah tempatan hanya untuk utama. 30 00:01:23,520 --> 00:01:26,980 Hanya utama tahu apa keputusan yang berubah-ubah adalah. 31 00:01:26,980 --> 00:01:30,010 tiga tidak boleh menggunakannya. 32 00:01:30,010 --> 00:01:32,580 >> Sekarang seperti yang saya nyatakan, pembolehubah global memang wujud. 33 00:01:32,580 --> 00:01:35,575 Jika anda mengisytiharkan pembolehubah yang di luar apa-apa fungsi, 34 00:01:35,575 --> 00:01:38,290 semua fungsi dalam program boleh merujuk kepadanya. 35 00:01:38,290 --> 00:01:44,010 Jadi dalam kes ini, saya telah ditonjolkan dalam hijau pengisytiharan pembolehubah global. 36 00:01:44,010 --> 00:01:45,830 Dalam kes ini, makhluk berubah diisytiharkan 37 00:01:45,830 --> 00:01:48,720 dipanggil global, hanya untuk amat jelas mengenainya. 38 00:01:48,720 --> 00:01:49,720 Ia adalah jenis terapung. 39 00:01:49,720 --> 00:01:52,940 Dan saya sediakan nilai 0,5050. 40 00:01:52,940 --> 00:01:58,080 >> Anda akan melihat bahawa dalam utama dan di tiga kali ganda, saya dapat rujuk global. 41 00:01:58,080 --> 00:02:03,480 Dan sebenarnya, jika saya pergi melalui program ini seperti yang dinyatakan, panggilan pertama utama tiga kali ganda, 42 00:02:03,480 --> 00:02:10,440 mendarab tiga global dengan 3, yang menetapkan nilai kepada 1.5-sesuatu, 43 00:02:10,440 --> 00:02:16,080 1.51 atau sesuatu seperti itu, dan kemudian utama juga mencetak nilai 44 00:02:16,080 --> 00:02:16,620 global. 45 00:02:16,620 --> 00:02:24,424 Jadi utama tidak akan mencetak 0,5050, ia akan mencetak kali global 3, 1.51. 46 00:02:24,424 --> 00:02:27,340 Jadi anda perlu berhati-hati apabila anda bekerja dengan pembolehubah global. 47 00:02:27,340 --> 00:02:30,260 Walaupun mereka sangat fleksibel dalam dapat memberikan maklumat 48 00:02:30,260 --> 00:02:32,650 sekitar supaya setiap fungsi boleh menggunakannya, 49 00:02:32,650 --> 00:02:34,580 ia juga boleh mempunyai beberapa akibat yang berbahaya 50 00:02:34,580 --> 00:02:38,770 jika perubahan satu fungsi nilai pembolehubah 51 00:02:38,770 --> 00:02:42,360 sebelum anda mengharapkan ia akan berubah. 52 00:02:42,360 --> 00:02:44,200 >> Mengapa perkara perbezaan ini? 53 00:02:44,200 --> 00:02:48,070 Mengapa kita peduli sama ada beberapa pembolehubah adalah tempatan dan lain-lain global? 54 00:02:48,070 --> 00:02:53,880 Nah, untuk sebahagian besar, pembolehubah tempatan dalam C adalah apa yang dipanggil diluluskan oleh nilai 55 00:02:53,880 --> 00:02:56,087 apabila kita membuat panggilan fungsi. 56 00:02:56,087 --> 00:02:56,920 Apa maksudnya? 57 00:02:56,920 --> 00:03:00,880 >> Nah, apabila pembolehubah diluluskan oleh nilai, CALLEE, yang 58 00:03:00,880 --> 00:03:04,350 adalah cara lain untuk mengatakan majlis itu yang menerima pembolehubah yang 59 00:03:04,350 --> 00:03:08,465 mendapat diluluskan pada sebagai input, ia sebenarnya tidak menerima pembolehubah yang sendiri. 60 00:03:08,465 --> 00:03:12,490 Ia menerima sendiri salinannya untuk bekerja dengan. 61 00:03:12,490 --> 00:03:14,350 Ini adalah perbezaan yang benar-benar penting. 62 00:03:14,350 --> 00:03:18,250 Kita hanya melihat kedua yang lalu yang dengan pembolehubah global, 63 00:03:18,250 --> 00:03:23,240 jika kita memanipulasi global berubah-ubah dalam satu fungsi, kesan 64 00:03:23,240 --> 00:03:26,390 kerana satu fungsi membawa melalui setiap fungsi lain. 65 00:03:26,390 --> 00:03:28,920 >> Tetapi dengan pembolehubah tempatan, yang tidak benar. 66 00:03:28,920 --> 00:03:32,060 Setiap fungsi apabila ia menerima pembolehubah sebagai input 67 00:03:32,060 --> 00:03:36,367 menerima salinan pembolehubah-pembolehubah, tidak pemboleh ubah diri mereka sendiri. 68 00:03:36,367 --> 00:03:37,825 Jadi apa kesan sampingan itu? 69 00:03:37,825 --> 00:03:40,450 Ini bermakna bahawa pembolehubah dalam pemanggil, fungsi yang 70 00:03:40,450 --> 00:03:45,600 adalah membuat panggilan fungsi, adalah tidak berubah melainkan anda mengatasinya. 71 00:03:45,600 --> 00:03:50,420 >> Sebagai contoh, dalam kod ini foo tidak berubah sama sekali. 72 00:03:50,420 --> 00:03:55,450 Int foo sama dengan 4, panggil tiga kali ganda foo, di dalam tiga 73 00:03:55,450 --> 00:03:58,850 kita akan menjangkakan foo yang akan didarab dengan 3 dan kembali, 74 00:03:58,850 --> 00:04:01,450 tetapi sebenarnya tidak memberi kesan. 75 00:04:01,450 --> 00:04:03,460 >> Di sini walaupun, perbezaan yang sangat halus. 76 00:04:03,460 --> 00:04:06,520 Ini tidak mempunyai kesan yang kita mahu. 77 00:04:06,520 --> 00:04:07,730 Adakah anda melihat mengapa? 78 00:04:07,730 --> 00:04:11,500 Kami mengatasi foo di utama masa ini. 79 00:04:11,500 --> 00:04:16,899 >> Jadi foo int sama dengan 4, foo sama foo tiga, apabila kita membuat panggilan itu, 80 00:04:16,899 --> 00:04:21,680 tiga kali ganda mendapat salinan sendiri foo, salinan sendiri 4. 81 00:04:21,680 --> 00:04:27,340 Ia berkata kembali 4 kali 3, atau apa sahaja berubah-ubah mendapat diluluskan dalam masa 3. 82 00:04:27,340 --> 00:04:32,109 Dan kemudian kita memberikan pulangan nilai tiga kali ganda kepada foo lagi. 83 00:04:32,109 --> 00:04:33,650 Jadi ini sebenarnya akan menulis ganti foo. 84 00:04:33,650 --> 00:04:35,816 Inilah satu-satunya cara untuk melakukan ini dengan pembolehubah tempatan. 85 00:04:35,816 --> 00:04:38,120 Oleh sebab itu jika kita menambah satu lagi baris kod di sini 86 00:04:38,120 --> 00:04:40,870 pada akhir utama untuk mencetak nilai foo, 87 00:04:40,870 --> 00:04:45,030 ia akan sebenarnya mencetak 12. 88 00:04:45,030 --> 00:04:48,600 >> Skop Pembolehubah umumnya tidak terlalu banyak masalah 89 00:04:48,600 --> 00:04:51,190 jika anda menamakan semua anda pembolehubah perkara yang berbeza. 90 00:04:51,190 --> 00:04:54,920 Tetapi ia boleh mendapatkan jenis jahat jika nama pemboleh ubah yang sama 91 00:04:54,920 --> 00:04:58,820 muncul dalam pelbagai fungsi, yang akan berlaku banyak. 92 00:04:58,820 --> 00:05:02,130 Jika anda pernah melakukan kerja di dunia sebenar di mana 93 00:05:02,130 --> 00:05:06,080 anda bekerja pada kerjasama program dan orang dalam pasukan yang berbeza 94 00:05:06,080 --> 00:05:11,000 bekerja bersama-sama untuk menulis yang sama program atau set yang sama program, 95 00:05:11,000 --> 00:05:13,900 mereka sering akan menggunakan semula berubah-ubah nama, orang-orang yang amat biasa 96 00:05:13,900 --> 00:05:18,020 seperti x, y, i, j, dan sebagainya. 97 00:05:18,020 --> 00:05:20,370 >> Tetapi apabila pembolehubah mempunyai nama yang sama, isu-isu skop 98 00:05:20,370 --> 00:05:23,080 boleh mendapatkan lebih sukar sedikit untuk menghuraikan. 99 00:05:23,080 --> 00:05:26,790 Sebagai contoh, adakah anda tahu apa yang akan dicetak 100 00:05:26,790 --> 00:05:30,190 pada akhir program ini tertentu? 101 00:05:30,190 --> 00:05:31,280 Ambil satu minit. 102 00:05:31,280 --> 00:05:33,382 Jeda video dan membaca melalui program ini. 103 00:05:33,382 --> 00:05:35,590 Anda boleh lihat di bahagian kita mempunyai akuan fungsi 104 00:05:35,590 --> 00:05:37,350 untuk fungsi yang dipanggil kenaikan. 105 00:05:37,350 --> 00:05:40,800 Fungsi yang mengambil satu parameter, integer yang kita panggil x. 106 00:05:40,800 --> 00:05:42,610 Dan output integer. 107 00:05:42,610 --> 00:05:44,820 Itulah jenis pulangan pada awal. 108 00:05:44,820 --> 00:05:48,140 >> Kemudian kita mempunyai utama, beberapa baris kod dalam utama, yang terakhir yang 109 00:05:48,140 --> 00:05:49,250 adalah kenyataan cetak. 110 00:05:49,250 --> 00:05:51,140 Dan ingat, itu soalan di sini. 111 00:05:51,140 --> 00:05:54,240 Apa yang sebenarnya akan menjadi dicetak di akhir majlis ini? 112 00:05:54,240 --> 00:05:58,110 Dan kemudian kita sebenarnya mempunyai Takrif kenaikan di bawah. 113 00:05:58,110 --> 00:06:01,760 >> Oleh itu, mengambil satu minit, langkah melalui kod, mengesan perkara-perkara. 114 00:06:01,760 --> 00:06:08,100 Adakah anda tahu apa yang akan dicetak di akhir program khusus ini? 115 00:06:08,100 --> 00:06:08,600 >> Baiklah. 116 00:06:08,600 --> 00:06:11,433 Mudah-mudahan, anda telah mengambil beberapa saat untuk mencuba dan menghuraikan satu ini keluar. 117 00:06:11,433 --> 00:06:13,370 Mari kita buat bersama-sama. 118 00:06:13,370 --> 00:06:16,022 >> Jadi saya telah melintasi daripada kenaikan ini pengisytiharan di atas sana. 119 00:06:16,022 --> 00:06:17,230 Ia adalah jenis gangguan. 120 00:06:17,230 --> 00:06:18,570 Ia tidak berubah sendiri. 121 00:06:18,570 --> 00:06:19,879 Ia tidak mempunyai skop tersendiri. 122 00:06:19,879 --> 00:06:21,920 Ia hanya satu majlis pengisytiharan, jadi untuk tujuan 123 00:06:21,920 --> 00:06:24,330 cuba untuk menghuraikan mengetahui apa yang berlaku dalam program ini, 124 00:06:24,330 --> 00:06:26,660 kita mungkin juga hanya mengelakkannya. 125 00:06:26,660 --> 00:06:29,560 >> Sekarang kita mempunyai dalam kes ini, sebab masalah ini adalah rumit 126 00:06:29,560 --> 00:06:34,030 adalah kerana kita mempunyai pembolehubah tempatan dalam kedua-dua utama dan kenaikan, setiap yang 127 00:06:34,030 --> 00:06:35,090 adalah dipanggil x. 128 00:06:35,090 --> 00:06:39,830 Dan sudah tentu pokok isu ini adalah cuba untuk suss mana x mendapat berubah 129 00:06:39,830 --> 00:06:41,890 dan bagaimana ia dapat berubah. 130 00:06:41,890 --> 00:06:46,900 Jadi saya telah berwarna tiap-tiap ketika x itulah tempatan ke merah utama. 131 00:06:46,900 --> 00:06:52,040 Dan saya telah berwarna setiap contoh x itulah tempatan untuk kenaikan biru. 132 00:06:52,040 --> 00:06:55,220 >> Notis bahawa garis ketiga daripada utama, y ​​sama dengan kenaikan 133 00:06:55,220 --> 00:07:00,800 x, kenaikan yang tidak menjadi diluluskan x utama, atau x merah. 134 00:07:00,800 --> 00:07:03,320 Ia mendapat lulus suatu salinan pernyataan itu. 135 00:07:03,320 --> 00:07:06,987 Dan ia hanya akan bekerja dengan bahawa salinan itu, x biru. 136 00:07:06,987 --> 00:07:08,820 Jika anda secara matematik cenderung, anda mungkin 137 00:07:08,820 --> 00:07:14,230 telah bukannya memikirkan ini sebagai x sub m untuk utama dan x sub i untuk kenaikan. 138 00:07:14,230 --> 00:07:15,700 Tetapi ia adalah idea yang sama. 139 00:07:15,700 --> 00:07:18,999 x sub m, atau merah x dalam slaid sebelumnya, 140 00:07:18,999 --> 00:07:21,790 adalah pembolehubah yang local-- adalah atas kehendak x sebaliknya 141 00:07:21,790 --> 00:07:26,900 adalah tempatan utama, dan x sub i, atau pembolehubah biru dalam slaid sebelumnya, 142 00:07:26,900 --> 00:07:30,760 adalah contoh x yang adalah tempatan untuk kenaikan. 143 00:07:30,760 --> 00:07:36,220 >> Jadi, adakah anda mampu untuk memahami apa yang fungsi ini dicetak di akhir? 144 00:07:36,220 --> 00:07:39,420 Saya Doug Lloyd, dan ini adalah CS50. 145 00:07:39,420 --> 00:07:41,542