DOUG LLOYD: Seperti yang anda mula bekerja dengan fungsi,
perkara yang lain akan menjadi benar-benar penting untuk memahami,
yang merupakan konsep skop berubah-ubah.
Jadi skop ialah ciri pembolehubah
yang mentakrifkan yang fungsi pembolehubah yang boleh diakses.
>> Terdapat dua skop utama dalam C, pembolehubah tempatan dan pembolehubah global.
Sekarang, pembolehubah tempatan hanya boleh diakses dalam fungsi
di mana mereka diwujudkan.
Mereka tidak boleh diakses oleh setiap lain fungsi yang wujud dalam program anda,
hanya fungsi dalam mana ia dibuat.
Pembolehubah global, pada Sebaliknya, boleh diakses
oleh mana-mana fungsi dalam program ini.
Dan sebab itulah kerana mereka tidak dicipta di dalam
apa-apa fungsi tertentu.
Kami mengaku mereka di luar semua fungsi, yang
bermakna setiap fungsi tahu di mana ia adalah dan boleh mengakses dan memanipulasi ia.
>> Setakat ini dalam perjalanan anda sudah cukup banyak telah bekerja secara eksklusif
dengan pembolehubah tempatan.
Berikut adalah satu contoh yang sangat, sangat Fungsi utama yang ringkas dan sangat mudah
fungsi tambahan yang kita telah menulis.
Dalam kes ini, x, yang Saya berwarna hijau hanya
untuk menyerlahkan kawasan itu atau skop pembolehubah yang,
adalah tempatan untuk majlis itu tiga kali ganda.
utama tidak boleh merujuk kepada x sama sekali.
Ia tidak tahu apa yang ada.
Tiada fungsi lain, sebenarnya, jika kita mempunyai fungsi tambahan di sini,
boleh merujuk kepada x.
>> Begitu juga, keputusan yang saya telah berwarna biru, adalah tempatan hanya untuk utama.
Hanya utama tahu apa keputusan yang berubah-ubah adalah.
tiga tidak boleh menggunakannya.
>> Sekarang seperti yang saya nyatakan, pembolehubah global memang wujud.
Jika anda mengisytiharkan pembolehubah yang di luar apa-apa fungsi,
semua fungsi dalam program boleh merujuk kepadanya.
Jadi dalam kes ini, saya telah ditonjolkan dalam hijau pengisytiharan pembolehubah global.
Dalam kes ini, makhluk berubah diisytiharkan
dipanggil global, hanya untuk amat jelas mengenainya.
Ia adalah jenis terapung.
Dan saya sediakan nilai 0,5050.
>> Anda akan melihat bahawa dalam utama dan di tiga kali ganda, saya dapat rujuk global.
Dan sebenarnya, jika saya pergi melalui program ini seperti yang dinyatakan, panggilan pertama utama tiga kali ganda,
mendarab tiga global dengan 3, yang menetapkan nilai kepada 1.5-sesuatu,
1.51 atau sesuatu seperti itu, dan kemudian utama juga mencetak nilai
global.
Jadi utama tidak akan mencetak 0,5050, ia akan mencetak kali global 3, 1.51.
Jadi anda perlu berhati-hati apabila anda bekerja dengan pembolehubah global.
Walaupun mereka sangat fleksibel dalam dapat memberikan maklumat
sekitar supaya setiap fungsi boleh menggunakannya,
ia juga boleh mempunyai beberapa akibat yang berbahaya
jika perubahan satu fungsi nilai pembolehubah
sebelum anda mengharapkan ia akan berubah.
>> Mengapa perkara perbezaan ini?
Mengapa kita peduli sama ada beberapa pembolehubah adalah tempatan dan lain-lain global?
Nah, untuk sebahagian besar, pembolehubah tempatan dalam C adalah apa yang dipanggil diluluskan oleh nilai
apabila kita membuat panggilan fungsi.
Apa maksudnya?
>> Nah, apabila pembolehubah diluluskan oleh nilai, CALLEE, yang
adalah cara lain untuk mengatakan majlis itu yang menerima pembolehubah yang
mendapat diluluskan pada sebagai input, ia sebenarnya tidak menerima pembolehubah yang sendiri.
Ia menerima sendiri salinannya untuk bekerja dengan.
Ini adalah perbezaan yang benar-benar penting.
Kita hanya melihat kedua yang lalu yang dengan pembolehubah global,
jika kita memanipulasi global berubah-ubah dalam satu fungsi, kesan
kerana satu fungsi membawa melalui setiap fungsi lain.
>> Tetapi dengan pembolehubah tempatan, yang tidak benar.
Setiap fungsi apabila ia menerima pembolehubah sebagai input
menerima salinan pembolehubah-pembolehubah, tidak pemboleh ubah diri mereka sendiri.
Jadi apa kesan sampingan itu?
Ini bermakna bahawa pembolehubah dalam pemanggil, fungsi yang
adalah membuat panggilan fungsi, adalah tidak berubah melainkan anda mengatasinya.
>> Sebagai contoh, dalam kod ini foo tidak berubah sama sekali.
Int foo sama dengan 4, panggil tiga kali ganda foo, di dalam tiga
kita akan menjangkakan foo yang akan didarab dengan 3 dan kembali,
tetapi sebenarnya tidak memberi kesan.
>> Di sini walaupun, perbezaan yang sangat halus.
Ini tidak mempunyai kesan yang kita mahu.
Adakah anda melihat mengapa?
Kami mengatasi foo di utama masa ini.
>> Jadi foo int sama dengan 4, foo sama foo tiga, apabila kita membuat panggilan itu,
tiga kali ganda mendapat salinan sendiri foo, salinan sendiri 4.
Ia berkata kembali 4 kali 3, atau apa sahaja berubah-ubah mendapat diluluskan dalam masa 3.
Dan kemudian kita memberikan pulangan nilai tiga kali ganda kepada foo lagi.
Jadi ini sebenarnya akan menulis ganti foo.
Inilah satu-satunya cara untuk melakukan ini dengan pembolehubah tempatan.
Oleh sebab itu jika kita menambah satu lagi baris kod di sini
pada akhir utama untuk mencetak nilai foo,
ia akan sebenarnya mencetak 12.
>> Skop Pembolehubah umumnya tidak terlalu banyak masalah
jika anda menamakan semua anda pembolehubah perkara yang berbeza.
Tetapi ia boleh mendapatkan jenis jahat jika nama pemboleh ubah yang sama
muncul dalam pelbagai fungsi, yang akan berlaku banyak.
Jika anda pernah melakukan kerja di dunia sebenar di mana
anda bekerja pada kerjasama program dan orang dalam pasukan yang berbeza
bekerja bersama-sama untuk menulis yang sama program atau set yang sama program,
mereka sering akan menggunakan semula berubah-ubah nama, orang-orang yang amat biasa
seperti x, y, i, j, dan sebagainya.
>> Tetapi apabila pembolehubah mempunyai nama yang sama, isu-isu skop
boleh mendapatkan lebih sukar sedikit untuk menghuraikan.
Sebagai contoh, adakah anda tahu apa yang akan dicetak
pada akhir program ini tertentu?
Ambil satu minit.
Jeda video dan membaca melalui program ini.
Anda boleh lihat di bahagian kita mempunyai akuan fungsi
untuk fungsi yang dipanggil kenaikan.
Fungsi yang mengambil satu parameter, integer yang kita panggil x.
Dan output integer.
Itulah jenis pulangan pada awal.
>> Kemudian kita mempunyai utama, beberapa baris kod dalam utama, yang terakhir yang
adalah kenyataan cetak.
Dan ingat, itu soalan di sini.
Apa yang sebenarnya akan menjadi dicetak di akhir majlis ini?
Dan kemudian kita sebenarnya mempunyai Takrif kenaikan di bawah.
>> Oleh itu, mengambil satu minit, langkah melalui kod, mengesan perkara-perkara.
Adakah anda tahu apa yang akan dicetak di akhir program khusus ini?
>> Baiklah.
Mudah-mudahan, anda telah mengambil beberapa saat untuk mencuba dan menghuraikan satu ini keluar.
Mari kita buat bersama-sama.
>> Jadi saya telah melintasi daripada kenaikan ini pengisytiharan di atas sana.
Ia adalah jenis gangguan.
Ia tidak berubah sendiri.
Ia tidak mempunyai skop tersendiri.
Ia hanya satu majlis pengisytiharan, jadi untuk tujuan
cuba untuk menghuraikan mengetahui apa yang berlaku dalam program ini,
kita mungkin juga hanya mengelakkannya.
>> Sekarang kita mempunyai dalam kes ini, sebab masalah ini adalah rumit
adalah kerana kita mempunyai pembolehubah tempatan dalam kedua-dua utama dan kenaikan, setiap yang
adalah dipanggil x.
Dan sudah tentu pokok isu ini adalah cuba untuk suss mana x mendapat berubah
dan bagaimana ia dapat berubah.
Jadi saya telah berwarna tiap-tiap ketika x itulah tempatan ke merah utama.
Dan saya telah berwarna setiap contoh x itulah tempatan untuk kenaikan biru.
>> Notis bahawa garis ketiga daripada utama, y ​​sama dengan kenaikan
x, kenaikan yang tidak menjadi diluluskan x utama, atau x merah.
Ia mendapat lulus suatu salinan pernyataan itu.
Dan ia hanya akan bekerja dengan bahawa salinan itu, x biru.
Jika anda secara matematik cenderung, anda mungkin
telah bukannya memikirkan ini sebagai x sub m untuk utama dan x sub i untuk kenaikan.
Tetapi ia adalah idea yang sama.
x sub m, atau merah x dalam slaid sebelumnya,
adalah pembolehubah yang local-- adalah atas kehendak x sebaliknya
adalah tempatan utama, dan x sub i, atau pembolehubah biru dalam slaid sebelumnya,
adalah contoh x yang adalah tempatan untuk kenaikan.
>> Jadi, adakah anda mampu untuk memahami apa yang fungsi ini dicetak di akhir?
Saya Doug Lloyd, dan ini adalah CS50.