>> SPEAKER 1: Hi semua orang.
Kami akan bermula.
Saya fikir orang ramai masih akan menjadi menapis dalam.
Tetapi demi kepentingan masa, jadi kita boleh mendapatkan kalian keluar dari sini pada masa,
kita akan bermula.
Jadi mengalu-alukan kepada CS50 Kuiz 0 ulasan.
Bagi anda yang tidak menyedari lagi, anda mempunyai soalan pada Rabu.
Woo-hoo.
>> Jika anda belum mula mempelajari belum atau tidak sedar bahawa ini wujud lagi,
lalu kuiz dan semua maklumat mengenai kuiz anda berada di cs50.net/quizzes.
Ada beberapa perkara yang cukup baik di sana, lalu kuiz dari 10 lepas
tahun serta maklumat mengenai kuiz ini dan topik
yang akan dilindungi.
Jadi mari kita bermula.
>> Jadi, anda mungkin ingat guys, yang pertama hari kelas David mempunyai lampu mereka pada.
Jadi pada asasnya, semua yang pergi di bawah hood daripada komputer ialah
dilakukan dalam perduaan.
Binary bermakna apa yang didengari seperti, 0 dan 1 ini.
Ia mempunyai dua nilai-nilai yang boleh diwakili.
>> Jadi, seperti pada hari pertama seksyen apabila David dihidupkan cahaya
mentol untuk mewakili, atau 1, komputer kita memahami binari sebagai 0 dan
1 ini, hidup atau mati.
Asas Binary.
Setiap tempat diwakili dalam asas dua.
Jadi anda menambah 2 kepada 0 kepada 1 hingga 2 semua jalan sehingga.
>> Untuk mengira apa binari anda adalah untuk perpuluhan, anda hanya mengikuti persamaan ini
perkara jenis.
Jika anda mempunyai 1 dalam mana-mana tempat, anda kalikan dengan apa jua
mendasarkan ia dalam, tambahkan ia, dan anda mendapat perpuluhan.
Jadi, ini adalah bagaimana anda mengira 5 dalam perduaan.
Sama seperti apa yang kami lakukan pada slaid lepas, ini adalah bagaimana anda akan
mewakili 1 hingga 5.
>> Begitu juga, seperti anda boleh menambah dan tolak dalam perpuluhan atau asas 10, atau
benar-benar apa-apa asas, di boleh menambah dan tolak dalam perduaan.
Tepat sekali apa yang anda inginkan apabila anda menambah dua sehingga, jika ia bersamaan lebih besar
daripada 1, anda membawa 1, menjadikannya sebagai 0, dan melakukan tambahan dengan cara itu, hanya
seperti yang anda inginkan dengan tetap perpuluhan atau mana-mana asas lain.
Sejuk.
>> Jadi seperti yang saya katakan sebelum ini, semua yang berlaku di bawah hood daripada komputer kita
dilakukan dalam 0 dan 1, atau binari.
Jadi bagaimana kita menyatakan, sebagai contoh, huruf, atau nombor, atau aksara?
Dan jawapan kepada yang ASCII.
>> ASCII adalah pemetaan antara huruf yang biasanya kita lihat dalam
Bahasa Inggeris seperti A, B, C, menekankan, sengkang, dan
apa-apa seperti itu.
Dan peta itu kepada nilai ASCII.
Nilai ASCII hanyalah sebilangan yang boleh difahami oleh komputer anda.
Dan seperti yang anda boleh lakukan penambahan dan tolak dengan nombor, anda boleh melakukannya
mereka dengan nilai-nilai ASCII.
>> Jadi dalam contoh ini, apa yang ini akan mencetak?
Yeah, jadi A ruang B ruang ruang C D. Di manakah tetikus saya pergi?
Perhatikan anda boleh menentukan int satu di 65.
Dan apabila anda mencetak bahawa dengan menggunakan peratus C, ia akan mentafsir bahawa sebagai
watak dan akan mencetak A.
>> Begitu juga, anda boleh mengisytiharkan sebagai char a.
Dan apabila anda mencetak dengan menggunakan peratus C, ia akan mentafsir bahawa sebagai
peratus D. Dan seperti anda boleh menambah nombor, anda boleh menambah watak-watak yang
Nilai ASCII, dalam kes ini.
>> Jadi penunjuk sedikit untuk semua orang.
5, sebagai rentetan, tidak sebenarnya sama dengan 5.
Jadi bagaimana kita boleh menukar rentetan 5 kepada integer 5?
Apa-apa idea?
Yeah.
>> Jadi, jika kita ada 5 sebagai rentetan, kita boleh menolak 0.
Dan yang akan memberi kita 5.
Begitu juga, jika kita mempunyai 5 sebagai integer, menambah bahawa untuk tali 0.
Dan yang memberikan kita tali 5.
Sejuk.
>> Sekarang, ingat kembali untuk bersyarah di mana kita berbincang mengenai algoritma.
Jadi bagaimana kita benar-benar mahu komputer untuk melakukan perkara-perkara yang menarik?
Anda tahu, hanya menambah dan menolak nombor dan perkara-perkara percetakan keluar tidak
yang menarik.
Biasanya, kita mahu komputer kami untuk melaksanakan beberapa jenis algoritma.
Sesuatu yang kompleks yang lebih kecil daripada hanya aritmetik mudah.
>> Algoritma adalah hanya langkah demi langkah set arahan untuk bagaimana untuk melakukan
yang task-- tertentu
hanya suka resipi.
Anda mungkin masih ingat hari pertama kelas di mana Daud telah kami mengira bilik
orang dan berapa ramai orang yang berada di dalam bilik.
Anda mungkin digunakan untuk pengiraan satu persatu.
1, 2, 3, 4.
Dalam kes itu, algoritma masa linear.
>> Tetapi Daud memperkenalkan algoritma untuk anda untuk mengira orang di dalam bilik
di mana semua orang berdiri, anda mengatakan anda nombor untuk orang lain, menambah bahawa
bilangan, dan satu orang duduk.
Dan anda mengulangi itu.
Itu satu jenis algoritma.
Kita boleh menganalisis bagaimana cekap algoritma adalah berdasarkan kepada ia berjalan masa.
Tetapi kita akan bercakap sedikit lebih lanjut mengenai yang kemudian.
>> Jadi semua algoritma juga boleh ditulis dalam kod pseudo.
Pseudokod hanya bahasa Inggeris seperti sintaks yang digunakan untuk mewakili
bahasa pengaturcaraan.
Sebagai contoh, jika kita mahu bertanya pengguna meneka nombor kegemaran saya, kami
mungkin mempunyai pseudokod seperti itu.
>> Dapatkan pengguna meneka.
Jika tekaan betul, beritahu mereka mereka betul, lagi memberitahu mereka
mereka tidak betul.
Dan pseudokod adalah satu cara mudah mewakili idea atau algoritma.
Jadi sekarang kita mungkin mahu untuk benar-benar menulis ini dalam bahasa yang komputer
mungkin pemahaman.
Oleh itu, kita boleh menulis pseudokod dan mentafsir itu ke dalam kod sumber.
>> Setakat ini, kod sumber mestilah mematuhi kepada sintaks tertentu
bahasa pengaturcaraan.
Dan setakat ini, dalam CS50, kita kena telah menggunakan kebanyakannya c.
Jadi ini mungkin Kod sumber untuk c.
Kemudian dalam perjalanan, anda malam datang terkena pengaturcaraan lain
bahasa seperti PHP.
Atau jika anda juga mengambil kelas-kelas lain, anda mungkin melakukan Java, Python, malah OCML.
Tetapi dalam bahasa c program kami, ini adalah bagaimana kita boleh menulis kod sumber untuk
algoritma pseudokod yang Saya hanya diterangkan sebelum ini.
>> Jadi bagaimana komputer anda sebenarnya faham itu?
Seperti yang saya katakan sebelum ini, ia hanya benar-benar memahami sifar dan orang-orang.
Jadi bagaimana ia dapat daripada sumber kod untuk sesuatu yang boleh
difahami?
Nah, kita mempunyai sesuatu dipanggil pengkompil.
>> Jika anda ingat kembali di kebanyakan anda psets, anda mempunyai beberapa jenis program
ditulis dalam dot c fail.
Dan kemudian anda akan menaip make.
Jadi apa yang membuat lakukan?
>> Anda boleh menaip make untuk menyusun anda program kerana someone--
sesiapa yang menulis p set anda; mungkin David--
mencipta fail make.
Dan yang memberitahu membuat tahu untuk menjalankan anda pengkompil, yang dipanggil dilafaz, wasiat yang
kemudian menyusun kod sumber anda untuk membantah kod, yang sifar dan orang-orang
bahawa komputer anda memahami.
Tetapi lama kemudian, kita akan pergi lebih mendalam mengenai penyusun.
>> Jadi ingat Serangga 0, jika- ya, anda mempunyai soalan?
>> PENONTON: [didengar]?
>> SPEAKER 1: Ya.
Saya fikir mereka benar-benar perlu berada dalam talian.
Yeah.
>> PENONTON: Adakah ia seperti [didengar]?
>> SPEAKER 1: Ia tidak.
Yang berada di cs50.net/quizzes.
>> PENONTON: Slash kuiz, slash 2013, mengurangkan 0, dan klik melalui
kuiz 2013 dan kuiz 0, mengkaji semula seksyen slaid.
>> SPEAKER 1: Yeah, jadi jika anda semua mahu tarik dan melihat ia pada anda
komputer sendiri, itu denda juga.
Mengatakan bahawa sekali lagi.
>> PENONTON: [didengar].
>> SPEAKER 1: Yeah, [didengar] adalah pembolehubah dummy.
Oh, ya?
>> PENONTON: [didengar]?
>> SPEAKER 1: Tidak, mogok tidak pada peperiksaan.
Maaf, soalan beliau ialah, adalah mogok pada peperiksaan.
Dan ia tidak.
Jadi Serangga 0, anda semua harus mempunyai semua dilaksanakan dengan menggunakan sesuatu yang awal.
Dan kita belajar beberapa asas pengaturcaraan blok bangunan menggunakan awal.
>> Jadi mari kita lihat beberapa blok-blok bangunan
yang membentuk program.
Pertama adalah ungkapan Boolean.
Ungkapan Boolean adalah orang-orang dan 0 atau apa-apa yang mempunyai
dua nilai yang mungkin.
Dalam kes ini, benar atau salah, hidup atau mati, dan ya atau tidak.
Contoh yang mudah, sangat mudah, program yang menggunakan Boolean yang
ungkapan di sini.
>> Jadi dalam usaha untuk ungkapan Boolean untuk berguna, kita mempunyai operator Boolean.
Ini adalah pengendali yang boleh digunakan untuk membandingkan nilai-nilai tertentu.
Oleh itu, kita mempunyai dan atau tidak sama dengan kurang, daripada atau sama dengan, lebih besar daripada atau
sama dengan, dan kurang daripada atau lebih daripada.
Tetapi pengusaha ini tidak sangat berguna jika kita boleh menggabungkan mereka ke dalam
syarat.
>> Jadi anda semua mungkin ingat dari awal dan dari p anda menetapkan bahawa kita
mempunyai syarat-syarat.
Mereka adalah, pada dasarnya, seperti garpu dalam logik program anda yang
melaksanakan bergantung kepada sama ada keadaan dipenuhi.
Jadi salah satu syarat bahawa kita mempunyai digunakan banyak kali di dalam kursus ini adalah
jika, lain, jika, dan syarat-syarat lain.
>> Berikut adalah satu contoh bagaimana anda mungkin menggunakannya.
Adakah sesiapa yang tahu perbezaan antara hanya menggunakan jika kenyataan semua
jalan turun ayat jika, lain, jika, dan lain digabungkan?
Ya?
>> PENONTON: [didengar].
>> SPEAKER 1: Tepat sekali.
Jadi, jika saya terpaksa jika semua jalan ke bawah ini cara, walaupun keadaan ini pulangan
benar, ia masih akan terus menguji dua akan datang.
Manakala, dengan lain-jika, lagi satu pernyataan, jika seseorang kembali benar,
yang lain tidak diuji.
Apa-apa soalan tentang itu?
Sejuk.
>> Jadi anda menggunakan lain jika-of lagi satu penyata jika anda tahu bahawa ia hanya boleh
menjadi salah satu daripada kes-kes ini.
Oleh itu, kita tahu jika x ialah kurang daripada 0, ia pasti tidak akan menjadi
lebih besar daripada 0.
>> Seterusnya, satu lagi blok bangunan yang kita belajar adalah gelung.
Kami mempunyai tiga jenis gelung.
Untuk gelung, gelung while, dan lakukan semasa gelung.
Dan secara amnya, apabila anda duduk untuk menulis sesuatu, anda perlu membuat keputusan
yang mana satu di tiga anda hendak gunakan.
Jadi bagaimana kita membuat keputusan yang mana satu?
>> Kami biasanya menggunakan untuk gelung jika kita tahu berapa kali kita mahu iterate
melalui sesuatu atau berapa kali kita mahu untuk melaksanakan tugas.
Kami menggunakan gelung sementara jika kita memerlukan keadaan adalah benar untuk menjaga berjalan.
Dan kita lakukan semasa menggunakan hampir sama dengan sementara, tetapi kami mahu kod untuk berjalan pada
kurangnya satu masa.
>> Begitu sementara, yang ada di tugasan yang akan sentiasa menjalankan sekurang-kurangnya satu masa.
Manakala, dengan sementara, ia tidak boleh berjalan pada semua jika
keadaan tidak berpuas hati.
Sebarang pertanyaan dengan itu?
>> Jadi struktur untuk gelung.
Kamu semua telah melihat ini.
Anda memulakan ia.
Anda mempunyai beberapa jenis keadaan.
Jadi, sebagai contoh, kita mungkin memulakan sebagai i sama dengan 0.
i adalah kurang daripada 10.
Dan i ++.
Salah satu yang sangat mudah yang kami lakukan.
>> Untuk gelung sementara, juga, anda perlu untuk mempunyai beberapa jenis pengawalan,
beberapa jenis keadaan, dan beberapa jenis kemas kini.
Oleh itu, kita boleh melaksanakan kami untuk gelung juga sebagai gelung semasa menggunakan ini.
Dan begitu juga dengan do manakala gelung, kita mungkin mempunyai beberapa pengawalan,
melaksanakan sesuatu, mengemaskini, dan kemudian memeriksa keadaan.
>> Jadi sekarang fungsi.
Kita meletakkan semua bersama-sama.
Kita mungkin mahu menulis beberapa jenis fungsi.
Fungsi biasa yang anda mungkin lihat sudah adalah utama.
Utama adalah fungsi.
Ia mempunyai jenis balasan, int.
Ia mempunyai nama tugas, utama.
Dan ia mempunyai hujah, dan argc argv.
Jadi utama hanya fungsi.
>> Fungsi-fungsi lain yang anda mungkin telah digunakan, printf printf-- adalah function-- yang
GetInt, toupper.
Tetapi ini berlaku kepada telah dilaksanakan untuk kami oleh
beberapa jenis perpustakaan.
Jika anda semua masih ingat termasuk perpustakaan CS50.h ini atau
Saya standard / O perpustakaan.
Ya, soalan?
>> PENONTON: Apakah utama hanya wujud dalam c?
Adakah ia hanya jenis [didengar]?
>> SPEAKER 1: Soalan ini adalah jika utama wujud dalam c.
Dan ya, semua fungsi mempunyai fungsi utama.
Ia adalah jenis yang diperlukan untuk komputer tahu di mana untuk bermula
berjalan kod.
>> PENONTON: Oleh itu, anda tidak akan [didengar]?
>> SPEAKER 1: Tidak
Apa-apa soalan lain?
Sejuk.
Jadi seperti yang anda boleh menggunakan fungsi yang ditulis untuk anda, anda juga boleh
menulis fungsi anda sendiri.
Ini adalah fungsi yang seseorang mungkin telah menulis untuk mengira jumlah
sebuah q, sebagai contoh.
Ada jenis pulangan di sini, dalam kes ini int, kita q nama tugas dan kami
senarai parameter.
>> Dan ambil perhatian bahawa anda perlu menulis data jenis parameter yang anda mahu
menggunakan atau lain fungsi yang tidak tahu apa jenis
parameter yang perlu saya akan menerima.
Jadi, dalam kes ini, kita mahu integer sebagai input kami.
Jadi mengapa kita mungkin mahu menggunakan fungsi?
>> Pertama sekali, besar untuk organisasi.
Mereka membantu memecahkan kod anda ke lebih dianjurkan ketulan dan membuat
lebih mudah untuk dibaca.
Pemudahan.
Ini adalah baik untuk reka bentuk.
Apabila anda membaca sekeping kod dan fungsi utama adalah benar-benar,
benar-benar panjang, ia mungkin lebih sukar untuk sebab kira-kira apa yang berlaku.
Jadi jika anda memecahkan ia ke dalam fungsi, ia mungkin lebih mudah untuk dibaca.
Dan menggunakan semula-keupayaan.
Jika anda mempunyai sebahagian kod yang yang menjadi dipanggil atau menjalankan beberapa kali,
bukannya menulis semula kod yang 10 kali dalam fungsi utama anda, anda mungkin
mahu menggunakannya semula.
Kemudian setiap kali anda perlu menggunakan yang sekeping kod, memanggil fungsi tersebut.
>> Jadi sekarang jika kita ingat kembali ke awal, kami juga bercakap tentang beberapa konsep,
salah satu yang threading.
Thread adalah konsep pelbagai urutan kod
melaksanakan pada masa yang sama.
Jadi berfikir kembali kepada satu hari di mana Daud kalian mengira off bilangan
orang di dalam bilik.
>> Pada asasnya, apa yang berlaku atas adalah semua kalian adalah
berjalan benang berasingan.
Dan orang-orang benang telah datang bersama-sama untuk mendapatkan beberapa jenis jawapan.
Begitu juga, dalam Scratch, apabila anda mempunyai pelbagai sprites, anda mungkin
mempunyai kucing dan anjing.
Dan mereka akan pada masa yang sama berjalan skrip mereka sendiri.
Itu adalah contoh threading.
>> Dan konsep lain yang merupakan diperkenalkan pada awal adalah peristiwa-peristiwa.
Dan peristiwa adalah apabila pelbagai bahagian kod anda berkomunikasi antara satu sama lain.
Dalam Scratch, ini adalah apabila anda menggunakan siaran kawalan dan Apabila saya
Terima blok.
>> Dan juga, dalam Set Masalah 4, kita lihat sedikit peristiwa juga.
Kalian mungkin telah menggunakan perpustakaan Gevent.
Dan ada fungsi waitForClick di mana anda sedang menunggu
bagi pengguna untuk klik.
Dan klik, dalam kes ini, akan menjadi Sekiranya dan menunggu klik adalah anda
acara pengendali.
>> Dan juga, sepanjang berjalan psets anda dan bekerja di psets anda, anda
mungkin bersentuhan dengan beberapa arahan ini.
Ini adalah apa yang anda taip ke dalam anda tetingkap terminal atau apa sahaja tetingkap
yang akan kelihatan pada g edit anda ke, dasarnya, navigasi komputer anda.
>> Jadi, sebagai contoh, LS menyenaraikan kandungan direktori.
Buat direktori mencipta folder baru.
CD, direktori perubahan.
RM, membuang, menghapuskan fail atau beberapa direktori.
Dan kemudian keluarkan direktori membuang direktori.
>> PENONTON: [didengar]?
>> SPEAKER 1: Ya, pasti.
Maaf, soalan itu jika anda akan mencadangkan meletakkan ini
pada lembaran yang menipu.
Ia boleh membantu.
Jika anda mempunyai ruang, anda boleh meletakkan ia.
Ia juga hanya umumnya cukup baik ingat kerana apabila anda menggunakannya
anda mungkin mahu hanya mempunyai ia menghafal.
Yang akan menjadikan kehidupan anda lebih mudah.
Adakah saya menjawab soalan anda?
>> Jadi sekarang, kita bercakap sedikit secara ringkas mengenai perpustakaan.
Tetapi dua yang utama yang kita telah menggunakan setakat ini dalam kursus ini adalah
standard I / O dan cs50.
Apakah jenis perkara-perkara yang termasuk dalam pustaka I / O piawai?
>> Ya, setakat ini kami telah menggunakan printf.
Dalam cs50, kami telah menggunakan GetInt dan GetString.
Dan tali jenis data juga berlaku harus diisytiharkan di perpustakaan cs50 ini.
Kami akan bercakap sedikit lebih mendalam mengenai bagaimana perpustakaan bekerja dan bagaimana mereka
berinteraksi dengan seluruh kod anda.
Tetapi mereka adalah dua yang utama yang kita telah datang dalam hubungan dengan setakat ini dalam
kursus.
>> Jenis.
Ini adalah baik untuk ingat berapa banyak setiap jenis diwakili oleh atau bagaimana
banyak bait setiap jenis menghendaki
int, 4 bait; char, 1 bait.
Float adalah 4 bait.
Apakah dua?
>> PENONTON: [didengar].
>> SPEAKER 1: Yeah, jadi apungan tetapi dua kali ganda saiz.
Bagaimana pula dengan yang lama?
>> PENONTON: [didengar].
>> SPEAKER 1: OK.
Apa yang lama?
>> PENONTON: [didengar].
>> SPEAKER 1: Ya, dua kali ganda int satu.
Ya.
>> PENONTON: [didengar].
>> SPEAKER 1: Long [didengar].
Dan kemudian yang panjang panjang adalah dua kali ganda.
>> PENONTON: Tidak, tidak.
A panjang hanya satu int.
Ia bergantung kepada seni bina sebelum [didengar]
dan int mempunyai saiz yang sama.
[Didengar].
>> SPEAKER 1: Jadi yang panjang dan int satu adalah sama.
Dan kemudian yang panjang panjang dua kali ganda int itu.
Sejuk.
Kemudian, apakah jenis terakhir?
>> PENONTON: pointer.
>> SPEAKER 1: Yeah, jadi kami belajar sedikit tentang petunjuk.
Dan tidak kira apa penunjuk adalah menunjuk supaya- ia boleh menjadi bintang char
atau int star--
ia sentiasa 4 bait untuk penunjuk.
Soalan-soalan tentang itu?
Ya?
>> PENONTON: [didengar]?
>> SPEAKER 1: Jadi yang panjang dan int satu adalah yang sama dalam perkakas cs50 ini.
>> PENONTON: Perkakas benar-benar ditukar ganti.
>> SPEAKER 1: Yeah.
Jadi kemudian lama lama dua int satu.
>> PENONTON: Ini adalah sedikit 32?
>> SPEAKER 1: 32 bit, yeah.
>> PENONTON: Jadi [didengar]?
>> SPEAKER 1: Ya, jika ia tidak tegas mengatakan, anda
harus menganggap sedikit 32.
>> PENONTON: Ia akan mengatakan sesuatu seperti menganggap satu
seni bina seperti perkakas.
64 bit, perkara itu sahaja perubahan adalah Roh meronta-ronta dan petunjuk.
Mereka kedua-dua [didengar].
>> SPEAKER 1: Ya?
>> PENONTON: Soalan.
Maka pada salah satu kuiz amalan, ia meminta kira-kira int tidak bertanda.
Jadi bagaimana yang akan ditentukan dari int [didengar]?
>> SPEAKER 1: tidak ditandatangani dalam juga 4 bait.
Tetapi apa yang berbeza tentang yang ditandatangani int dan int tidak bertanda?
>> PENONTON: [didengar].
>> SPEAKER 1: Betul.
Satu boleh mewakili nilai-nilai negatif.
Tetapi bagaimana ia berbuat demikian?
>> PENONTON: [didengar].
>> SPEAKER 1: Ya, ia menjimatkan 1 bit untuk mewakili tanda.
Yang ditandatangani mempunyai satu bit yang mewakili tanda.
Dan tidak ditandatangani hanya adalah semua positif.
>> PENONTON: OK.
Jadi, anda mengatakan bahawa dua adalah dua kali ganda saiz apungan?
>> SPEAKER 1: Double adalah dua kali ganda saiz apungan, ya.
>> PENONTON: Bagaimana penunjuk untuk yang panjang panjang [didengar]?
>> SPEAKER 1: Jadi persoalannya ialah bagaimana penunjuk untuk long-- yang panjang
bagaimana adalah bahawa hanya empat bait apabila lama lama 8 bytes itu.
Jadi ingat apa yang penunjuk, pada dasarnya, pada nilai yang sangat asas.
>> PENONTON: [didengar].
>> SPEAKER 1: Yeah, jadi penunjuk hanya lokasi ingatan.
Jadi tidak kira berapa banyak ruang pointer yang menunjuk ke.
Ia hanya memerlukan 4 bytes untuk mengesan daripada lokasi ingatan.
Apa-apa soalan lain?
Sejuk.
>> Jadi perkara terakhir yang saya adalah output standard.
Anda perlu menggunakan mereka kerap cukup yang anda boleh ingat.
Tetapi ini adalah apabila kita menggunakan printf, sebagai contoh.
Dan kita mempunyai ruang letak ini yang dipanggil Kod format.
>> Jadi peratus c char, peratus untuk int i, dan kami juga boleh menggunakan peratus d.
Ia adalah perkara yang sama.
Tetapi, secara amnya, dalam CS50 kami cuba menggunakan peratus i.
F peratus bagi apung.
Ld peratus untuk tempoh yang lama dan panjang peratus kerana tali.
>> Begitu juga, kami telah menggunakan beberapa ini urutan melarikan diri.
Sebagai contoh, backslash n bagi talian baru.
Ini hanya untuk apabila anda memformat kod anda untuk cetakan f.
Ya?
>> PENONTON: Apakah peratus untuk d?
>> SPEAKER 1: Jadi soalan adalah apa yang peratus untuk d?
Peratus d adalah untuk ints.
Peratus dan peratus d i adalah sama.
>> PENONTON: Apakah perbezaan di antara backslash n dan garis sendeng terbalik r?
>> SPEAKER 1: Jadi persoalannya ialah apa yang Perbezaan di antara tindak balas n dan
r tindak balas?
Saya fikir garis sendeng terbalik r is--
>> PENONTON: Jadi garis sendeng terbalik r hanya membayangkan kembali ke permulaan baris
tanpa benar-benar pergi ke baris baru.
Jadi, jika anda mencetak r garis sendeng terbalik dan anda kembali ke permulaan baris
maka anda mencetak barangan lanjut, anda menulis ganti yang barangan yang sudah di
[Didengar].
Manakala, n sebenarnya pergi ke baru talian dan pergi ke [didengar].
>> SPEAKER 1: Nah, apa-apa soalan lain?
Baiklah.
Saya akan serahkan luar untuk Dan yang akan berterusan.
>> [Tepuk tangan]
>> DAN: Semua righty.
Jadi saya akan bercakap tentang satu lagi luas pelbagai idea daripada kelas yang
secara kasar wakil minggu dua dan permulaan minggu bermula tiga off
dengan pemutus, yang hanya satu cara merawat nilai jenis tertentu sebagai
nilai dari jenis yang berbeza.
Oleh itu, kita boleh melakukan ini dengan aksara untuk ints, terapung untuk ints, dan
Roh meronta-ronta untuk menggandakan panjang.
>> Semua perkara-perkara ini boleh digunakan sebagai cara merawat beberapa nilai numerik
tolak char kerana beberapa lain nilai nombor.
Jadi terdapat beberapa isu dengan ini, daripada Sudah tentu, yang datang apabila anda membuang
hal-hal seperti apungan untuk ints.
Jadi ini adalah sedikit pelik.
Kami mempunyai apungan iaitu 1.31.
Kami kalikan dengan 10,000.
Dan kemudian kita mencetak sebagai int satu.
Apa output ini?
10,000 kali 1.31.
Jadi 13,000, ialah meneka?
>> PENONTON: Saya fikir ia adalah 10,000.
>> DAN: Jadi saya mendarabkannya dengan 10,000 sebelum saya pemutus itu.
>> PENONTON: Oh.
Tidak akan ada satu 9 dan beberapa nombor 0?
>> DAN: Anda mungkin mempunyai beberapa digit pelik.
Jadi betul, ia 1.3 kali 10,000.
Jadi itulah 13,000.
Dan weird-- tambahan ini
>> PENONTON: 13,100.
>> DAN: 13,100.
Terima kasih, Rob.
Dan weirdness-- tambahan ini
ini 9,9--
adalah semata-mata kerana pemutus ini akhirnya pembulatan ke bawah di mana
ia tidak sepatutnya.
Yeah.
>> PENONTON: pemutus ini berlaku selepas apa-apa lagi?
>> DAN: Jadi kerana saya mempunyai ini dalam media cetak, ia melakukan pendaraban ini sebelum ia
tidak pemutus ini.
>> PENONTON: [didengar].
>> DAN: Saya rasa ia akan membuang pertama, yeah, yang akan menjadi 10,000.
Apa-apa lagi?
Sejuk.
Jadi ini adalah 13099.
Mengapa ini berlaku?
Ketakpersisan.
>> Pelampung tidak sempurna.
Mereka hanya boleh mewakili nombor kepada sebilangan angka bererti.
Jadi, jika kita mencetak 8 buah ara sig pada apungan ini, kita akan mendapat sejenis
bilangan mencari hodoh.
Dan itu kerana 1.31 tidak boleh tepat diwakili oleh mudah
kuasa dua dalam mesin.
Jadi ia berakhir mengambil yang paling dekat meneka, yang berakhir
yang sedikit rendah.
Masuk akal?
OK.
>> Sekarang, dihidupkan adalah cara yang berbeza melakukan pernyataan bersyarat di mana semua
kita mengambil berat tentang adalah pembolehubah tunggal.
Jadi dalam contoh ini tertentu, kami mendapat integer dari pengguna.
Dan kemudian kita melihat apa integer yang.
Mungkin, ia adalah bilangan antara satu hingga empat.
Itulah apa yang kita minta.
>> Jadi, anda melakukan suis nama pembolehubah.
Kemudian anda menetapkan kes mungkin menghargai ia boleh menjadi.
Jadi huruf satu, berkata ia adalah rendah.
Dan kemudian anda memecahkan untuk keluar keadaan suis jadi
anda tidak menyimpan berterusan.
>> Dalam case-- seterusnya
jadi kes dua kes three--
jika ia kes dua ia hanya jatuh ke baris pertama kod yang ia lihat sebagai dengan
huruf tiga sehingga ia melihat rehat.
Jadi sebab anda mendapat kes satu hingga hanya cetak rendah kerana saya
mempunyai rehat ini di sini.
Jika saya, katakan, diabaikan break-- ini jika saya melemparkan breakaway-- ini
ia akan mencetak yang rendah, dan kemudian ia akan mencetak pertengahan, dan kemudian ia akan pecah.
>> Jadi rehat adalah satu bahagian penting bagi menukar syarat-syarat dan
mereka perlu berada di sana.
Mana-mana kes-kes yang tidak dinyatakan secara jelas dikendalikan oleh lalai
kes dalam suis dan perlu dibuang.
>> PENONTON: Jadi 1, 2, 3, dan 4 akan n?
>> DAN: Nilai-nilai yang n boleh.
Ya.
Yeah?
>> PENONTON: Oleh itu, apabila anda mempunyai bahawa [didengar]?
>> DAN: Anda akan mencetak yang rendah, dan kemudian ia akan mencetak tengah dan
maka ia akan pecah.
>> PENONTON: Mengapa ia akan mencetak tengah jika [didengar]?
>> DAN: Jadi segala-galanya di bawah kes sebelum rehat yang terletak di bawah.
Jadi kes cetak satu kes di bawah satu sebagai adalah cetakan ini berikut.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Jadi nombor ini hanya tertentu nilai yang berubah-ubah ini
boleh, bukan?
Adakah ini masuk akal?
Yeah.
>> PENONTON: [didengar]?
>> DAN: Ya, dua kes akan mencetak pertengahan dan kemudian pecah.
>> PENONTON: [didengar]?
>> DAN: Saya rasa apa-apa?
Apakah jenis data lain anda boleh menukar ke atas?
>> PENONTON: Anda boleh menukar atas mana-mana jenis data.
Tetapi ia bererti apa-apa yang lebih aksara dan ints dan barangan seperti itu, kerana
jika anda beralih penunjuk yang tidak benar-benar masuk akal,
beralih beban, jika ia walaupun mari anda lakukan itu, kerana mata terapung
dalam ketepatan, anda tidak akan benar-benar mahu berbuat demikian juga.
Jadi cukup banyak, hanya ints dan aksara dan barangan seperti itu.
>> DAN: Ya, ia adalah apabila anda mempunyai yang jelas nilai-nilai yang anda tahu, saya rasa, boleh
bahawa suis sebenarnya berguna.
Baik?
OK.
>> Skop adalah pelbagai yang yang diisytiharkan ubah memanjangkan.
Jadi dalam ini sebahagian kecil kod saya, ia akan penuh dengan kesilapan.
Dan sebab itu saya mengisytiharkan int ini i dalam skop ini untuk gelung.
Dan kemudian saya cuba untuk rujukan yang i di luar bahawa bagi skop gelung.
>> Jadi, pada asasnya, anda boleh berfikir tentang skop sebagai apa-apa yang anda mengisytiharkan
dengan di dalam satu set pendakap kerinting hanya wujud dalam orang-orang pendakap kerinting.
Dan jika anda cuba dan menggunakan pembolehubah yang di luar dari orang-orang pendakap kerinting, anda akan
mendapat ralat dari pengkompil.
Yeah?
>> PENONTON: Jadi yang satu ini tidak berfungsi?
>> DAN: Ini tidak berfungsi, ya.
Tali.
Rentetan char *.
Mereka betul-betul sama.
Mereka hanya petunjuk kepada watak-watak.
Dan mana-mana tali bahawa anda mempunyai sepatutnya berakhir dengan garis sendeng terbalik sifar, yang hanya
yang c konvensyen.
>> Ia dipanggil terminator yang NULL.
Dan NULL--
modal N, U modal, modal L, modal L--
tidak sama dengan Terminator NULL.
Ini adalah penunjuk.
Ini adalah watak.
Mereka sangat berbeza.
Ingat.
Ia akan menjadi kuiz, mungkin.
Saya tidak pernah melihat kuiz.
Yeah?
>> PENONTON: Jadi adalah NULL, berkata, penunjuk?
>> DAN: Ya.
>> PENONTON: Apa yang [didengar]?
>> DAN: Jika, berkata, malloc dipanggil apabila anda tidak mempunyai memori yang cukup untuk mendapatkan
apa saiz yang anda meminta, malloc akan kembali NULL.
Ia, pada dasarnya, apabila fungsi adalah sepatutnya kembali penunjuk, anda
perlu menyemak terhadap NULL kerana NULL adalah good-- cukup
itu, jenis, nilai sampah.
Ia sifar sejauh petunjuk pergi.
>> Setiap kali anda memanggil fungsi, yang mengembalikan penunjuk.
Anda akan mahu untuk memeriksa menjadi memastikan bahawa penunjuk yang tidak NULL
kerana NULL adalah sangat umum.
Ia semacam pulangan sampah.
Oleh itu, jika sesuatu yang tidak pergi ke kanan, hanya kembali NULL sebaliknya.
>> PENONTON: [didengar]?
>> DAN: Ya, dan itu ini.
>> PENONTON: [didengar]?
>> DAN: Eja sebagai ini.
Ia terminator NULL itu.
Ia huruf kecil N-U-L-L jika anda mengeja ia.
>> PENONTON: Dan saya hanya pergi belakang dan diuji.
Dan jika anda cuba untuk meletakkan satu titik terapung nilai ke dalam suis, ia akan menjerit pada anda
berkata, kenyataan memerlukan ungkapan jenis integer.
>> DAN: Terdapat anda pergi.
Tetapi yeah, apa soalan lagi?
>> PENONTON: [didengar]?
>> DAN: Jadi modal N, U modal, modal L, L modal adalah c perkara sebenar.
Ia adalah penunjuk NULL dan akan hanya diperlakukan sedemikian.
Anda tidak akan pernah cuba mengeja Watak NULL dan melihat apa-apa
cara yang lain daripada ini.
Yeah?
>> PENONTON: Jadi kembali ke char max atau sesuatu dalam nota, akan ia
merangkumi fungsi yang sama sebagai [didengar]?
>> PENONTON: Jadi yang anda merujuk kepada kembali max char dari getchar, atau
apa sahaja?
>> PENONTON: Yeah.
>> PENONTON: Yeah, jadi umum istilah untuk semua perkara-perkara
nilai-nilai sentinel.
Jadi seperti kembali int max dari GetInt dan char max dari getchar, ia
sepatutnya menjadi seperti, baiklah, jika perkara-perkara ini kembali kepada kami,
sesuatu yang salah.
>> Untuk petunjuk, kita hanya kebetulan mempunyai nilai sentinel ini bahawa setiap orang
bersetuju atas.
Dan ini adalah perkara yang anda kembali apabila berlaku kesilapan.
Jadi max char adalah apa yang kita gunakan untuk mewakili sesuatu
seperti NULL atau getchar.
>> PENONTON: Jadi jika anda menguji getchar, boleh anda hanya meletakkan NULL?
Yang akan membuat perbezaan?
>> DAN: Anda tidak boleh hanya menyemak NULL.
Anda harus memeriksa char max kerana nilai pulangan dari fungsi adalah
yang bersifat tidak penunjuk.
Yeah?
>> PENONTON: Soalan ini meminta untuk panjang tali.
Adakah ini termasuk watak NULL?
>> DAN: Tidak
Dan itulah sebenarnya bagaimana panjang rentetan tahu untuk berhenti kerana ia akan melalui
array anda sehingga aksara ia melihat watak NULL.
Dan kemudian ia seperti, semua betul, saya dilakukan.
>> PENONTON: [didengar] lima?
>> DAN: Hello berjumlah lima.
Yep.
Jadi tatasusunan adalah berterusan blok ingatan.
Mereka mempunyai akses segera dengan mengatakan yang nama array dan kemudian, dalam kerinting
pendakap, apa sahaja indeks anda mahu pergi kepada, mereka diindeks dari sifar melalui
panjang array tolak 1.
>> Dan mereka yang diisytiharkan oleh jenis yang perkara yang anda menyimpan dalam
array, nama array, dan kemudian apa saiz adalah array itu.
Jadi ini adalah pelbagai char panjang enam yang mempunyai nilai-nilai ini.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Yeah.
>> PENONTON: [didengar]?
>> DAN: Jika anda mempunyai apa yang sedang berlaku ke dalam array yang telah dibuat.
Oleh itu, anda boleh menentukan ini dan bukannya sebagai, katakan, char, apa sahaja nama anda
pelbagai adalah, kurungan kosong sama kerinting bersedia H koma koma E L L koma koma
O koma NULL watak dan pendakap kerinting.
Yang juga akan bekerja sebagai perisytiharan.
>> PENONTON: [didengar]?
>> DAN: Kemudian, anda perlu mempunyai saiz yang telah dibuat.
>> PENONTON: [didengar]?
>> DAN: Ya.
Semua righty.
Hujah baris arahan adalah cara mendapatkan input daripada pengguna sebagai
hujah untuk utama.
Utama mengambil dua hujah.
Bilangan hujah-hujah yang sedang diluluskan bersama-sama baris arahan dan
vektor tali atau pelbagai rentetan semua hujah-hujah.
>> Jadi, jika saya, katakan, yang dipanggil fungsi seperti titik keluar 1 ruang, 2 ruang, tiga,
argc akan 4.
Dan argv 0 akan menjadi titik keluar.
Argv1 akan menjadi 1.
argv2 akan 2. argv3 akan 3, dalam kes tertentu.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Elemen terakhir dalam tatasusunan kerana array adalah panjang argc ditambah
salah satu argb, elemen terakhir adalah penunjuk NULL itu.
Ia adalah argc campur 1.
Jadi dalam kes yang saya hanya berkata, ia akan argv 0 adalah titik keluar.
argv 1 adalah 1. argv2 adalah 2. argv 3 adalah 3.
argv 4, yang merupakan salah satu yang lebih besar daripada argc akan NULL.
>> Dan itulah penunjuk NULL.
Ya.
Dan itu kerana rentetan adalah bintang char adalah penunjuk.
Jadi ia perlu jenis yang sama.
Yeah?
>> PENONTON: Dua soalan.
Jadi satu, apa perbezaan di antara GetString ini dan lain-lain daripada satu jenis
dalam enjin pengguna?
Dan dua, ia disimpan di dalam memori terbaru anda?
Mahu, GetString akan menjadi [didengar]?
>> DAN: Di mana ia disimpan?
Saya tidak tahu di mana ia disimpan.
>> PENONTON: Jadi, sebenarnya, anda tahu bagaimana apa-apa berfungsi anda memanggil ia hujah
disimpan dalam tindanan?
Jadi argc dan argv adalah hujah untuk utama dan mereka pada timbunan, atau benar-benar
di atas apa yang anda fikirkan sebagai permulaan tindanan.
Apakah yang lain daripada soalan?
>> PENONTON: Jadi apa yang [didengar]?
>> DAN: Ya, ia hanya cara yang berbeza mendapatkan input daripada pengguna.
Sedikit lebih cekap dan ini seseorang ia handier skrip kerana anda
hanya boleh lulus hujah untuk utama anda fungsi dan bukannya perlu menunggu
bagi pengguna jika anda tidak mempunyai mana-mana pengguna.
>> PENONTON: Dan yeah, dapatkan tali akan [didengar].
Ia akan menyimpan barangan yang anda perlukan.
>> DAN: Ya?
>> PENONTON: [didengar]?
>> DAN: Ya, argv 0 sentiasa termasuk dot mengurangkan panggilan fungsi.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Ya, setiap satu daripada hujah-hujah yang berakhir pada watak NULL kerana mereka
adalah wayang.
>> PENONTON: [didengar]?
>> DAN: Ya, argv argc adalah penunjuk NULL.
>> PENONTON: [didengar]?
>> DAN: Oh yeah.
Yeah, maaf.
>> PENONTON: Jadi [didengar]?
>> DAN: Jadi persoalannya ialah jika anda mempunyai baris arahan dot dot mengurangkan keluar 1, 2,
akan bilangan baris arahan hujah-hujah dua atau ia akan menjadi tiga?
>> PENONTON: Saya rasa ia tidak benar-benar perkara itu.
Saya cenderung untuk mengatakan, oh, anda tidak lulus apa-apa hujah baris arahan apabila,
jelas, anda dipanggil fungsi.
Jadi saya cenderung untuk secara dinyanyikan mengecualikan fungsi dari baris arahan
hujah-hujah yang walaupun ia termasuk dalam argv.
>> DAN: Tetapi jika ia adalah pada test-- yang
yeah-- dan juga jika anda berkata sesuatu seperti argc bersamaan 3,
anda berada dalam kedudukan selamat.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Saya rasa jika bukan memanggil ini dalam argc dan tali kurungan argv
tetapi disimpan jenis yang sama dan hanya dipanggil mereka sesuatu yang berbeza seperti
dan b, akan ia masih berfungsi?
Dan ia masih bekerja, anda akan just--
bukannya menggunakan argc-- anda akan menggunakan dan b.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Jadi persoalannya ialah GetString adalah hendak menyimpan memori dalam timbunan itu
kerana GetString adalah char *.
Ia menyimpan memori dalam timbunan itu kerana ia panggilan malloc kini dalam sebenar
pelaksanaan GetString.
OK, beralih.
>> Keselamatan.
Jadi untuk menjadi benar-benar selamat, anda tidak bergantung kepada satu dan anda membenarkan tidak ada akses kepada mana-mana
maklumat anda, itulah sebabnya semua orang membina mesin mereka sendiri,
sistem operasi mereka sendiri, semua mereka program dari awal, dan jelas
jangan sambung kepada mana-mana mesin lain melalui internet.
Jadi komputer yang tidak selamat.
Mereka benar-benar adalah.
Kita perlu mempercayai orang lain.
>> Dan idea keselamatan adalah bahawa anda cuba untuk menghadkan jumlah
amanah yang anda perlukan.
Dan salah satu cara yang anda lakukan itu adalah melalui kriptografi.
Kriptografi adalah, pada dasarnya, kita mempunyai rahsia.
>> Kadang-kadang kita perlu lulus rahsia kami bersama-sama melalui, katakan, internet atau
perkara-perkara lain.
Dan kita tidak mahu orang untuk mengetahui rahsia ini.
Oleh itu, kita menyulitkan rahsia kami ke dalam cara yang yang kami berharap tidak ada yang dapat memikirkan.
>> Oleh itu, kita used--
melalui perjalanan class-- ini
hal-hal seperti Caesar cipher dan [Didengar], yang kedua-duanya adalah sangat, sangat
cara tidak selamat dari perkara yang menyulitkan.
Mereka mudah untuk memahami apa yang mereka dan apa rahsia anda.
Dunia sebenar menggunakan lebih skim penyulitan rumit.
Dan kami tidak akan masuk ke dalam lebih daripada itu.
>> Debugging.
GDB adalah yang terbaik.
Saya akan menekankan ini lagi.
Gunakan GDB sepanjang masa setiap masa anda mempunyai masalah.
Arahan yang berguna dalam GDB adalah memecahkan, yang anda lulus sama ada garis
nombor, nama fungsi, pada dasarnya di mana dalam kod anda, anda mahu berhenti,
dan dapat mengambil kawalan.
>> Cetak mengambil pembolehubah dan mencetak keluar apa sahaja yang berubah-ubah yang di yang
titik dalam pelaksanaan anda.
Seterusnya bergerak pelaksanaan anda sepanjang satu langkah.
Dan langkah langkah-langkah di dalam satu majlis dalam pelaksanaan anda.
>> Perkara lain dikendalikan, iaitu bagaimana anda sebenarnya menjalankan kod anda.
Terus mengambil semua langkah-langkah yang diperlukan untuk sampai ke titik rehat seterusnya.
Dan terdapat banyak, banyak lagi.
Melihat mereka.
Mereka yang besar.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Ya, yang penyahpepijat a.
Jadi penyahpepijat adalah program yang membolehkan anda debug program anda.
Ia bukan satu program yang mendapati pepijat untuk anda, walaupun yang akan menjadi besar.
>> Dan terakhir bagi saya adalah carian.
Jadi jenis carian yang kita bercakap kira-kira di dalam kelas ini adalah carian linear,
yang hanya bahawa anda melihat melalui setiap elemen ruang carian, satu
elemen pada satu masa, sehingga anda mencari apa yang anda sedang mencari atau sehingga anda mencapai
akhir ruang carian anda di mana menunjukkan anda mengatakan bahawa anda tidak dapat mencari
elemen yang anda cari.
Dan ini mengambil masa yang terbaik tetap, yang adalah 0 dan 1 di linear paling teruk
masa, yang adalah 0 n.
>> Carian binari, yang memerlukan elemen-elemen kotor.
Anda pergi ke tengah-tengah unsur-unsur anda, melihat jika elemen yang anda sedang mencari
adalah lebih besar atau lebih kecil daripada elemen bahawa anda berada di tengah-tengah.
Ia itu lebih besar, anda mengatakan bahawa bahagian bawah carian anda ruang yang anda
lokasi semasa, tengah-tengah, dan anda memulakan semula proses.
Jika ia lebih kecil, anda melihat mengatakan yang the-- yeah, apa khabar?
>> PENONTON: [didengar]?
>> DAN: Ya.
Apa-apa jenis bentuk yang sudah diajar di kelas adalah permainan yang adil untuk ujian.
>> [Ketawa]
>> DAN: Dan hakikat bahawa anda tidak mempunyai untuk melakukannya untuk satu set masalah, itu adil
permainan untuk ujian.
>> PENONTON: Bolehkah kita pergi ke bagaimana ia supaya-
>> DAN: Ia akan pergi ke atas.
>> SPEAKER 2: kod sebenar untuk [Didengar] adalah pada study.cs50.net.
Jadi, jika anda melihat masalah amalan dalam halaman jenis merge daripada
study.cs50.net, ada kod untuk melaksanakan bergabung jenis.
Jadi, anda tidak perlu melaksanakan sendiri malam ini.
Tetapi pastikan anda memahami ia bukan daripada hanya menghafalnya.
>> PENONTON: [didengar]?
>> SPEAKER 2: Laman jenis merge pada study.cs50.net, terdapat amalan yang
masalah itu, jika anda klik melalui masalah, pada akhir sangat ada
penyelesaian, yang merupakan cantuman pelaksanaan semacam.
Tetapi pastikan anda memahaminya bukan hanya menghafal ia
atau menyalin ke bawah.
>> PENONTON: Dan yang sah dengan sempurna masalah untuk peperiksaan akan
sesuatu seperti inilah senarai.
Apakah senarai ini kelihatan seperti selepas satu langkah daripada pilihan jenis atau
jenis sisipan atau apa sahaja.
Satu lelaran penuh dengan senarai.
Jadi, walaupun anda tidak berakhir sehingga perlu kod untuk itu, anda perlu memahami ia
cukup untuk mengetahui bagaimana ia akan untuk mengubah suai pelbagai ini.
>> DAN: Itu sahaja untuk saya.
>> [Tepuk tangan]
>> LUCAS: Hey semua orang.
Nama saya Lucas.
Saya akan bercakap tentang rekursi, semua yang macam yang kita telah belajar dan
sedikit semua petunjuk.
OK?
Jadi pertama sekali, rekursi.
Apakah yang dimaksudkan untuk mengatakan bahawa fungsi adalah rekursif?
>> PENONTON: Panggilan sendiri.
>> LUCAS: OK, panggilan itu sendiri, ya.
Jadi seperti gambar ini, sebagai contoh.
Ia seperti di dalam gambar gambar dan sebagainya.
Sebagai contoh, anda boleh have-- sebagai Dan yang bercakap tentang carian binari.
Salah satu cara di mana carian binari adalah rekursif adalah hakikat bahawa anda
cuba untuk mencari nombor.
Oleh itu, anda pergi ke tengah-tengah.
Dan kemudian anda menyemak jika terdapat nombor di kiri dan di kanan.
>> Dan kemudian jika anda mengetahui bilangan adalah akan berada di sebelah kiri, ia adalah sama
perkara seperti melakukan pencarian semula tetapi hanya di sebelah kiri senarai.
Jadi itulah bagaimana ia kedengaran seperti ia rekursif.
Jadi itulah sebabnya kalian mempunyai rekursif penyelesaian untuk jenis merge.
>> OK, jadi di sini adalah satu contoh.
Jadi mari kita mengatakan bahawa saya mahu memilih semua nombor dari 1 hingga n.
Saya boleh sedar bahawa jumlah n nombor adalah n plus n minus 1 hingga 1.
Tetapi, jika saya melihat n tolak 1 campur n tolak 2 campur 1, itu yang sama
Perkara nombor menjumlahkan sehingga n tolak 1.
Jadi, saya boleh berkata jumlah sejumlah yang sama sama n dicampur dengan jumlah bagi n tolak 1.
Adakah ini masuk akal?
>> Dan saya juga akan mempunyai sesuatu yang lain dikenali sebagai kes asas, iaitu bahawa
hasil tambah nombor sehingga kepada sifar akan menjadi sifar.
Jadi sebaik sahaja saya mendapat jumlah sifar, saya berhenti mengira.
Adakah ini masuk akal?
>> Jadi di sini adalah satu contoh bagaimana Saya boleh melaksanakan itu.
Jadi saya mempunyai fungsi ini dalam beberapa.
Yang mengambil integer n.
Jadi di sini saya periksa dahulu jika n adalah kurang atau sama dengan sifar.
Jadi, jika ia kurang atau sama dengan sifar, saya kembali sifar, yang merupakan kes asas kami.
Jika tidak, saya hanya boleh kembali n plus jumlah nombor
satu hingga n tolak satu.
Masuk akal?
OK.
>> Jadi di sini adalah apa yang ia kelihatan seperti.
Anda mempunyai jumlah wang sebanyak 2 setaraf 2 dicampur dengan jumlah bagi 1.
Dan beberapa daripada 1 adalah 1 campur jumlah 0, yang adalah 0.
Masuk akal?
Jadi, jika kita melihat timbunan anda program, ini adalah apa yang ia kelihatan seperti.
>> Pertama, kita mempunyai fungsi utama.
Kemudian fungsi utama dipanggil jumlah 2.
Dan kemudian jumlah 2 akan berkata, oh, jumlah 2 sama 2 dicampur dengan jumlah bagi satu.
Jadi saya menambah jumlah 1 hingga tindanan.
Dan jumlah 1 akan memanggil jumlah 0, yang juga akan menambah
untuk tindanan.
Dan kemudian setiap orang-orang ini yang di atas yang lain perlu kembali
sebelum orang-orang lain boleh menyimpan berterusan.
>> Jadi, sebagai contoh, di sini, jumlah 0, pertama, akan kembali 0.
Dan kemudian memilih jumlah 1.
Kemudian sejumlah sebanyak 1 akan kembali 1 kepada jumlah 2.
Dan akhirnya, jumlah bagi 2 akan untuk kembali 3 hingga utama.
Adakah ini masuk akal?
>> Ia benar-benar penting untuk memahami bagaimana tindanan sedang berusaha dan cuba untuk
lihat jika ia masuk akal.
OK, jadi sorting.
Jadi mengapa sorting penting, pertama sekali?
Mengapa kita perlu mengambil berat?
Sesiapa sahaja?
Beri saya contoh?
Yeah?
>> PENONTON: [didengar].
>> LUCAS: Yeah, OK.
Oleh itu, anda boleh mencari dengan lebih cekap.
Itulah cara yang baik.
Jadi, sebagai contoh, kita mempunyai banyak perkara, sebenarnya, dalam kehidupan kita yang
disusun.
Sebagai contoh, kamus.
>> Ia amat penting untuk mempunyai semua kata-kata dalam beberapa jenis supaya kita
boleh mengakses dengan mudah.
Jadi, apa yang dikatakannya.
Anda boleh mencari dengan lebih cekap.
Fikirkan bagaimana sukarnya adalah untuk mempunyai kamus di mana perkataan yang
susunan rawak.
Anda akan perlu untuk melihat, cukup banyak, setiap perkataan tunggal sehingga anda mencari
kata yang anda cari.
>> Jika anda menggunakan Facebook juga, apabila yang anda cari pada rakan-rakan anda, anda
akan melihat bahawa Facebook meletakkan anda rakan lebih dekat adalah di atas orang-orang yang
bahawa anda tidak bercakap dengan yang banyak.
Jika anda pergi sepanjang jalan ke bahagian bawah senarai rakan anda, anda akan melihat
orang-orang yang anda mungkin tidak walaupun ingat bahawa anda berkawan dengan.
Dan itu kerana macam Facebook rakan-rakan anda berdasarkan bagaimana
menutup anda kepada mereka.
>> Jadi menganjurkan data.
Juga Pokemon.
Jadi anda lihat bahawa semua Pokemons mempunyai nombor.
Dan itu seperti mudah cara mengakses data.
>> PENONTON: Mengakses Pokemon.
>> LUCAS: Yeah.
>> PENONTON: [didengar].
>> LUCAS: Ya.
OK, jadi pemilihan jenis.
Pemilihan jenis akan memilih nilai terkecil terisih senarai yang setiap
masa dalam setiap lelaran.
Ia adalah jenis seperti jenis yang anda lakukan dalam kepala anda apabila anda cuba untuk
menyusun senarai di tangan.
>> Pada asasnya, semua yang anda lakukan adalah anda melihat untuk jumlah yang paling kecil.
Memasukkannya ke dalam senarai itu disusun.
Dan kemudian anda mencari seterusnya bilangan yang paling kecil.
Dan kemudian anda terus melakukan itu dan sebagainya.
>> Jadi jenis pemilihan pada dasarnya anda pilih setiap kali yang paling kecil
nilai terisih.
Letakkan di akhir disusun sebahagian daripada senarai.
Dan terus melakukan itu.
Jadi mari kita lihat apa yang cepat ini kelihatan seperti.
Jadi di sini adalah yang disusun dan senarai terisih.
>> Jadi untuk disusun dalam senarai, ia pada mulanya kosong.
Dan kemudian saya akan pilih bilangan paling kecil di sini, 2.
Jadi saya dapat nombor 2 dan saya meletakkan di depan senarai.
Kemudian saya mencari yang paling kecil yang akan datang elemen, iaitu 3.
Jadi saya meletakkan ia di hujung senarai itu disusun.
Dan kemudian saya terus melakukan itu.
Saya mencari 4 dan meletakkannya di akhir.
Cari 5 dan meletakkan ia pada akhir.
>> Dan melihat bagaimana semua masa-masa yang Saya berkata meletakkannya pada akhir adalah,
pada dasarnya, bertukar-tukar dua nilai.
OK?
Dan kemudian yang terkini, anda hanya mempunyai satu unsur lagi.
Jadi ia sudah disusun.
>> OK, jadi sisipan jenis.
Semacam Insertion anda akan mempunyai juga bahawa perkara yang telah disusun dan
senarai terisih.
Satu-satunya perkara adalah bahawa setiap kali anda menambah elemen ke disusun
senarai, anda hanya memilih elemen yang adalah di hadapan senarai terisih.
Dan kemudian anda akan mencari apa yang kedudukan ia harus disusun dalam
sebahagian daripada senarai.
>> Mari kita lihat apa ini begitu ini lebih masuk akal.
Jadi pada mulanya, sebagai contoh, saya cuba untuk memasukkan nombor tiga dalam
sebahagian disusun senarai.
Jadi senarai ini tidak mempunyai apa-apa.
Jadi saya hanya boleh meletakkan bilangan 3.
>> Sekarang, saya mahu untuk menambah nombor 5 hingga bahagian yang disusun senarai.
Jadi saya melihat nombor 5.
Saya perhatikan bahawa itu lebih besar daripada 3.
Jadi saya tahu bahawa ia perlu selepas 3.
Jadi saya meletakkan 3 dan 5.
>> Kemudian saya ingin memasukkan nombor 2.
Saya perhatikan bahawa bilangan 2 adalah benar-benar bertahan maka kedua-dua 3 dan 5.
Jadi saya benar-benar perlu meletakkan ia semua Cara permulaan senarai.
Jadi saya perlu, jenis, beralih semua elemen dalam senarai disusun jadi saya boleh
membuat ruang untuk nombor 2.
>> Kemudian saya melihat jumlah 6.
Saya melihat bahawa ia harus selepas 5.
Jadi saya meletakkan di sana.
Dan akhirnya, saya melihat nombor 4.
Dan saya perasan yang sepatutnya di antara 3 dan 5.
Dan kemudian saya meletakkan di sana dan peralihan semua elemen-elemen lain.
Masuk akal?
>> Bubble Susun.
Jadi semacam gelembung pada asasnya apa yang anda akan do-- kita memanggilnya gelembung
jenis kerana anda pergi melalui list-- yang ia sebenarnya lebih baik jika saya hanya menunjukkan
anda suka this--
dan anda akan membandingkan nombor bersebelahan.
Dan anda akan menukar mereka jawatan jika mereka tidak
dalam susunan yang betul.
>> Jadi, pada asasnya, apa yang akan berlaku di sini, sebagai contoh,
anda mempunyai 8 dan 6.
Anda tahu bahawa perintah itu akan disusun sebenarnya menjadi 6 dan 5, bukan?
Jadi anda akan menukar pesanan.
Kemudian saya lihat 8 dan 4 di sini.
Dan saya melakukan perkara yang sama.
Saya menukar semula.
Dan akhirnya, 2 dan 8.
Saya juga menukar mereka.
>> Ia dipanggil Bubble Susun kerana selepas setiap lelaran ini, sebenarnya,
bilangan terbesar dalam senarai mendapat semua jalan ke akhir senarai.
Adakah ini masuk akal?
Kerana ia memastikan pertukaran itu dan bergerak ke kanan.
>> OK, jadi ini adalah lelaran kedua.
Ia akan menjadi perkara yang sama.
Saya akan melakukan satu pertukaran dan kemudian yang terakhir.
Saya tidak ada tukar ganti dan senarai itu disusun.
Jadi dalam Bubble Susun, kita pada dasarnya menyimpan melalui senarai dan bertukar-tukar
perkara sehingga saya melihat bahawa saya tidak melakukan apa-apa pertukaran melakukan lelaran itu, yang
bermakna bahawa senarai sudah disusun.
Masuk akal?
>> Mari kita bercakap sedikit mengenai masa berjalan.
Jadi adakah anda semua masih ingat Big O, Omega, dan Theta?
Yeah?
OK, apakah O Big, pertama sekali?
>> PENONTON: [didengar].
>> LUCAS: Ya, ia dipanggil kes paling teruk runtime, yang hanya bermakna bahawa itu
berapa banyak yang anda mengharapkan program ini untuk mengambil untuk menjalankan.
Seperti, dari segi daripada--
dalam case-- ini n.
Bilangan elemen dalam senarai dalam kes yang paling teruk.
Seperti, dalam kes yang paling teruk mungkin.
>> Jadi untuk Bubble Susun, sebagai contoh, kita mempunyai O Big n persegi.
Mengapa kita mempunyai itu?
Mengapa Bubble Susun Big O n persegi?
>> PENONTON: [didengar].
>> LUCAS: Yeah, jadi mana-mana yang paling teruk akan bahawa saya akan perlu lakukan n lelaran.
Jadi setiap lelaran akan membawa unsur terbesar ke akhir
senarai.
Jadi mana-mana yang paling teruk ialah saya mempunyai untuk melakukan perkara yang n masa.
Dan untuk setiap masa-masa, saya perlu melakukan n swap kerana saya perlu membandingkan
setiap dua elemen.
Jadi itulah sebabnya ia n kuasa dua kerana ia n kali n.
>> Kemudian, jenis pemilihan juga n persegi kerana, untuk setiap lelaran, saya perlu
melihat setiap elemen tunggal dalam senarai.
Dan kemudian mencari yang paling kecil, yang bermaksud bahawa saya perlu
melihat melalui n elemen.
Dan saya perlu berbuat demikian n kali kerana Saya perlu memilih semua n elemen.
>> Satu jenis sisipan juga n persegi kerana senario kes paling teruk akan
berkenaan, satu, saya perlu memasukkan n nombor, bukan?
Jadi, saya sudah tahu bahawa saya akan mempunyai n lelaran.
Tetapi bagi setiap nombor-nombor, jika saya mempunyai untuk melihat semua nombor dalam
senarai disusun dan meletakkannya sepanjang jalan di hadapan, yang akan n persegi
kerana ia akan menjadi n kali n lagi.
Masuk akal?
Bagaimana Omega?
>> PENONTON: [didengar].
>> LUCAS: Ia senario yang terbaik.
Jadi ia seperti, dalam banyak kali untuk menyusun, senario kes terbaik ialah
apabila senarai itu sudah disusun.
Jadi anda tidak benar-benar mempunyai untuk melakukan apa-apa.
Bubble Susun mempunyai yang terbaik senario kes n.
Adakah anda semua tahu mengapa?
>> PENONTON: [didengar].
>> LUCAS: Ya, jika anda menjejaki sama ada catuan data mempunyai apa-apa pertukaran atau
tidak, jika anda mempunyai sesuatu seperti ditetapkan untuk benar jika ada lelaran, jika yang
senarai sudah disusun, pada dasarnya, apa yang akan berlaku adalah saya akan
cuba untuk menukar setiap dua unsur-unsur yang bersebelahan.
Saya akan melihat bahawa tiada swap.
Dan saya hanya kembali segera.
>> Jadi ia bermakna bahawa saya hanya terpaksa melalui senarai satu masa.
Jadi ia n kerana saya melihat di n elemen.
Kenapa pemilihan jenis n persegi?
>> Ya, walaupun senarai itu disusun, untuk setiap lelaran jenis pemilihan, saya
perlu memilih elemen yang minimum.
Ini bermakna bahawa saya keluar untuk melihat pada setiap unsur-unsur dalam terisih
menyenaraikan dan mencari minimum bagi setiap lelaran.
Adakah ini masuk akal?
>> Dan pedang sisipan adalah n kerana dalam kes saya cuba untuk memasukkan
nombor dan semua nombor, apabila saya cuba untuk memasukkan mereka, saya melihat bahawa mereka
berada dalam kedudukan yang betul.
Saya tidak perlu pergi memeriksa semua lain nombor dalam senarai terisih.
Jadi itulah sebabnya ia akan menjadi n.
Masuk akal?
Dan apa yang theta?
>> PENONTON: [didengar].
>> LUCAS: Apa, maaf?
Katakanlah lagi.
>> PENONTON: [didengar].
>> LUCAS: Tepat sekali.
Jadi, anda boleh lihat bahawa hanya pilihan disimpan di Merge jenis mempunyai thetas.
Dan itu kerana anda hanya mempunyai theta jika kedua-dua Big O dan Omega adalah sama.
OK.
Dan akhirnya, bergabung MENGASINGKAN dalam log n.
>> Dan kemudian, sebagai Dan telah berkata, Merge jenis jenis seperti cara yang sama
anda melakukan carian binari.
Oleh itu, anda mendapatkan senarai.
Dan anda akan dipotong dua.
Dan kemudian anda memotong mereka dalam bahagian yang lebih kecil.
Dan kemudian anda menggabungkan mereka.
Kalian ingat bahawa, bukan?
OK, kerana dia telah berkata.
>> OK, petunjuk.
Jadi apa penunjuk?
>> PENONTON: [didengar].
>> LUCAS: Suatu alamat.
OK.
Saya tahu bahawa David menunjukkan sekumpulan video binky dan perkara menunjuk
satu sama lain.
Tetapi saya suka untuk memikirkan petunjuk semata-mata sebagai alamat.
Jadi ia adalah satu pembolehubah yang akan untuk menyimpan alamat.
>> Jadi ia hanya pembolehubah istimewa ini iaitu empat bait panjang.
Ingatlah, bahawa penunjuk apa-apa jua adalah sentiasa empat bait panjang untuk 32-bit kami
mesin supaya kes dengan perkakas.
Dan ia hanya mempunyai lokasi yang pembolehubah di dalamnya.
>> OK, jadi memori ini, pada dasarnya.
Jadi setiap blok memori sebenarnya mempunyai label, yang merupakan alamat
memori slotty.
Ini bermakna bahawa saya boleh mempunyai yang menunjuk penunjuk kepada
mana-mana alamat-alamat ini.
Jadi sebab itulah kita akan menggunakan petunjuk adalah jika saya perlu ingat lokasi
bahawa pembolehubah tertentu adalah ingatan.
>> Dan kalian ingat bahawa salah seorang daripada mereka kes adalah jika saya mempunyai fungsi
jika saya benar-benar mahu anda swap untuk sahih, saya sebenarnya
perlu menghantar penunjuk.
Tidak berubah-ubah itu.
Adakah anda semua ingat bahawa?
Yang between-- perbezaan
apa nama?
Memanggil dengan nilai dan memanggil dengan merujuk, bukan?
>> OK, yeah.
Jadi panggilan oleh nilai.
Apabila anda hanya menghantar pembolehubah untuk berfungsi anda hanya menghantar nilai.
Jadi anda sebenarnya menghantar salinan pembolehubah.
Dan program anda tidak kisah kira-kira jika pembolehubah yang sama sebenarnya
membuat salinan.
>> Dan memanggil dengan merujuk bermakna Saya sebenarnya menghantar satu salinan
penunjuk kepada pembolehubah itu.
Jadi ia bermakna bahawa saya menghantar lokasi yang berubah-ubah.
Jadi rasa saya mempunyai lokasi berubah-ubah, apabila saya memanggil fungsi
dengan petunjuk, saya dapat benar-benar mengubah data yang berada di utama.
Masuk akal?
>> Walaupun, penunjuk adalah salinan, yang penunjuk masih mempunyai alamat sebenar
pembolehubah yang saya mahu kepada perubahan.
Masuk akal?
>> Jadi mewujudkan petunjuk.
Ingat, penunjuk sentiasa mempunyai jenis yang ia menunjuk
kepada dan kemudian bintang.
Dan kemudian anda meletakkan nama.
Jadi ingat bahawa bila-bila masa anda mempunyai apa sahaja bintang, ia seperti penunjuk kepada
bahawa apa sahaja yang boleh ubah menaip yang anda mempunyai.
>> Jadi di bintang, sebagai contoh, ia penunjuk dan integer.
Dan kemudian char bintang adalah penunjuk bintang char dan sebagainya.
Yeah?
>> PENONTON: Bagaimana jika kita mempunyai penunjuk kepada n untuk membintangi x.
Saya tahu bahawa mewujudkan penunjuk kepada x.
Adakah ia juga mengaku x integer?
>> LUCAS: OK, jadi apabila anda mengatakan n bintang x, anda tidak mewujudkan satu penuding kepada satu
x berubah-ubah.
Anda mewujudkan penunjuk dinamakan x.
>> PENONTON: [didengar].
>> LUCAS: Oleh itu, apabila saya katakan n bintang x, saya berkata, hey, dalam ingatan, saya akan
mendapatkan salah satu daripada tiga kotak.
Dan saya akan mengatakan bahawa yang akan menjadi x, yang
akan menjadi penunjuk.
Dan sesuatu yang menarik tentang petunjuk ialah kita mengatakan bahawa mereka mempunyai
4 bytes untuk mesin 32-bit.
Dan sebab bagi yang kerana 4 bait adalah 32-bit.
>> Dan mesin yang 64 bit sebenarnya mempunyai alamat petunjuk
yang 64 bit panjang.
Jadi ia hanya bermaksud bahawa saiz alamat dalam mesin adalah berbeza.
>> Jadi rujukan dan penyahrujukan.
Terdapat dua syarikat yang kalian harus ingat.
Yang pertama adalah Ampersand.
Yang kedua adalah bintang.
Jangan keliru dengan bahawa bintang dan ini STAR kerana ingat bahawa, dalam
kes ini, anda perlu n bintang.
>> Ia seperti satu perkara yang keseluruhan bersama-sama.
Tidak ada ruang bintang n.
Jadi ia bermakna bahawa ia jenis.
Ingat, apabila anda mempunyai bintang yang berubah-ubah, anda
bercakap tentang jenis.
>> Apabila anda mempunyai hanya bintang dan kemudian nama pembolehubah, ia bermakna bahawa
anda penyahrujukan penunjuk, yang bermakna anda sedang mencari di
penunjuk, mencari alamat itu menunjuk ke, pergi ke alamat itu,
dan melihat bila-bila masa anda mempunyai di sana.
Jadi saya memberitahu pelajar saya bahawa apabila anda mempunyai bintang, anda harus berfikir bahawa itu
singkatan kandungan.
>> Jadi jika anda mempunyai penunjuk dan anda melakukan pointer bintang, ia adalah
kandungan penunjuk.
Oleh itu, anda pergi ke apa ia menunjuk ke dan melihat kandungan yang malar.
Dan Ampersand adalah sama perkara seperti alamat.
>> Jadi, jika saya mempunyai pembolehubah a-- seperti, mari mengatakan bahawa saya int yang sama 3--
jika saya ingin mencari alamat yang pembolehubah ingatan, saya hanya boleh melakukan
Ampersand a.
Jadi ia satu alamat.
Masuk akal?
>> Jadi di sini adalah satu contoh.
Ini hilang b dan c int int.
Jadi int yang bersamaan 3 cara yang Saya akan pergi ke ingatan.
Dan saya akan untuk mencari slot yang dan meletakkan bilangan 3 di sini.
>> Dan kemudian int b bersamaan 4.
Saya akan melakukan perkara yang sama.
Pergi ke memori dan meletakkan sejumlah 4 dalam salah satu kotak.
Dan int sama 5.
Cari kotak yang lain dan meletakkan nombor 5.
>> Jadi apa baris ini melakukan keluar? n bintang setahun bersamaan Ampersand a.
Jadi pertama sekali, bintang n pa.
Apa yang ia lakukan?
>> PENONTON: [didengar].
>> LUCAS: Yeah, jadi n bintang setahun, pertama, mengisytiharkan penunjuk yang dipanggil setahun.
Dan kemudian ia memberikan nilai penunjuk bahawa untuk menjadi alamat a.
Jadi Ampersand a.
Kemudian, jika saya lakukan pb bintang, apa itu pb bintang?
>> Oh, maaf.
Ini juga hilang. n pb bintang.
Maksud saya pc bintang.
Saya minta maaf.
Ia adalah perkara yang sama.
Tetapi sekarang saya baik ar mewujudkan penunjuk untuk b dan kemudian penunjuk kepada c.
Yeah?
>> PENONTON: [didengar]?
>> LUCAS: Ya.
Jadi, jika anda pergi ke memori dan anda pergi ke kotak yang designator untuk setahun,
anda benar-benar pergi ke lihat alamat yang.
OK?
Yeah?
>> PENONTON: [didengar]?
>> LUCAS: Yeah, penunjuk alamat.
Jangan sekali-kali lupa bahawa.
Ia seperti yang paling penting bahagian mengenai petunjuk.
Ada menyimpan dan alamat kepada beberapa pembolehubah.
Apa-apa lagi?
Apa-apa soalan lain?
OK.
>> Jadi Petunjuk dan Perlengkapan.
Ingatlah bahawa apabila saya melakukan int array 3, pada asasnya, apa yang saya lakukan adalah saya, jenis
daripada, mengisytiharkan dalam penunjuk.
Jadi pelbagai jenis seperti penunjuk kepada tempat tertentu dalam ingatan di mana saya
diperuntukkan tiga slot untuk integer.
Adakah ini masuk akal?
>> Oleh itu, apabila saya lakukan int array 3, apa yang saya lakukan, pada dasarnya, adalah mewujudkan tiga
slot dalam ingatan.
Jadi saya hanya mencari tiga slot dalam ingatan.
Jadi jika saya lakukan, maka, pelbagai bintang, ia pada asasnya bermakna kandungan array,
yang bermakna saya memadam penunjuk, saya pergi ke tempat itu bahawa ia menunjuk kepada,
dan saya meletakkan nombor satu.
>> Dan kemudian, jika saya melakukan pelbagai bintang tambahan 1, itulah perkara yang sama seperti melakukan pelbagai
kurungan satu, yang hanya bermakna saya pergi ke tempat yang ia menghala ke arah.
Kemudian ditambah 1 jenama saya beralih satu kedudukan.
Jadi saya pergi ke kedudukan ini, sebenarnya, dan meletakkan nombor dua.
>> Dan kemudian, akhirnya, apabila saya melakukan array ditambah 2, saya pergi ke mana
menunjuk array di.
Dan kemudian saya berpindah ke blok ingatan.
Kemudian saya meletakkan nombor tiga di sini.
Yeah?
>> PENONTON: array Jadi bintang semata-mata berkata mata yang pertama.
Dan anda boleh tambah 1, hanya kerana kami hanya benar-benar
rujukan bahawa alamat pertama.
>> LUCAS: Yeah.
Mengapa kita, sebagai contoh, berkata pelbagai 0, array 1, 2 dan lokasi?
Saya katakan, mengapa anda lakukan 0, 1, 2, 3 dan bukannya 1, 2, 3?
Salah satu sebab adalah, satu, komputer programmer memilih untuk memulakan
mengira dari 0.
Dua adalah kerana apabila anda melakukan pelbagai 0, ia adalah perkara yang sama seperti melakukan pelbagai
ditambah 0, yang bermaksud saya pergi ke kedudukan itu, dan saya tidak
melangkau mana-mana blok ingatan.
Jadi, saya tidak bergerak apa-apa blok ingatan.
Yeah?
>> PENONTON: [didengar]?
>> LUCAS: Jadi dia bertanya apa yang perbezaan antara melakukan
ini atau melakukan malloc.
Salah satu perbezaan adalah bahawa int array 3 adalah mewujudkan
array dalam timbunan.
Dan apabila saya melakukan malloc, ia mewujudkan pada timbunan itu.
Adakah ini masuk akal?
>> Jadi bagaimana malloc benar-benar bekerja?
Jadi mengapa kita perlu untuk menggunakan malloc?
Jenis pengkompil anda angka semua pembolehubah yang diisytiharkan.
Dan dia mencipta ruang untuk semua daripada mereka dalam tindanan.
Jadi semua pembolehubah anda akan menjadi suatu tempat di tindanan.
Jadi di sini adalah pembolehubah persekitaran.
>> Jadi, pada asasnya, ruang bagi mereka pembolehubah dalam ingatan diperuntukkan di
menyusun masa.
Jadi ia bermakna bahawa komputer anda mempunyai tahu semua orang-orang pembolehubah
terlebih dahulu.
Ia tidak perlu tahu apa yang nilai anda akan dimasukkan ke dalam mereka.
Tetapi ia perlu mengetahui bagaimana memori banyak yang anda perlukan.
>> Tetapi sekarang mari kita mengatakan bahawa, sebagai contoh, anda mencipta array atau mengambil
rentetan yang anda mengambil daripada pengguna.
Anda tidak tahu berapa lama tali akan menjadi, sebagai contoh.
Jadi anda tidak tahu berapa banyak blok memori anda memperuntukkan, bukan?
>> Oleh itu, ia tidak benar-benar masuk akal untuk anda untuk mengatakan meletakkan 100 aksara.
Kemudian apa jika pengguna menulis 150?
Anda akan diskru.
>> Jadi, pada asasnya, anda tidak boleh pastikan bagaimana memori banyak yang anda perlu memperuntukkan
apabila anda menyusun program ini.
Anda hanya tahu bahawa pada masa berjalan.
Jadi itulah sebabnya anda mempunyai timbunan itu.
Jadi timbunan itu akan mempunyai memori bahawa anda memperuntukkan semasa
tempoh program berjalan.
>> Jadi, pada asasnya, apabila anda melakukan malloc, apa yang anda lakukan memperuntukkan memori di
runtime, yang bermaksud bahawa anda memutuskan pada ketika itu bahawa anda
harus mempunyai memori itu.
Jadi, apabila anda memperuntukkan ia.
Adakah ini masuk akal?
>> Jadi ingat, tindanan mempunyai pembolehubah yang dicipta pada masa kompil.
Kemudian timbunan itu mempunyai pembolehubah yang dicipta seperti yang anda pergi
dengan malloc, sebagai contoh.
>> PENONTON: [didengar]?
>> LUCAS: Jadi GetString adalah akan memanggil malloc.
Biar saya bercakap tentang malloc, dan Saya akan menjelaskan GetString.
Jadi malloc adalah perkara yang sama sebagai peruntukan ingatan.
Jadi ia akan memperuntukkan ingatan pada timbunan itu.
Dan ia akan kembali penunjuk kepada di mana memori yang telah diperuntukkan di.
>> Oleh itu, apabila anda do--
di sini untuk example--
n pointer bintang.
Kemudian penunjuk sama malloc Saiz kali inci 10.
Saya mewujudkan penunjuk.
Kemudian saya memberikan yang penunjuk kepada nilai penunjuk yang malloc
memberi saya.
>> Jadi saya meminta malloc boleh anda memperuntukkan ruang untuk 10 integer.
Itulah apa yang ia berkata.
Dan malloc memberikan saya kembali penunjuk ke tempat itu.
Masuk akal?
OK.
Saya Dan GetString adalah, pada dasarnya, melakukan panggilan untuk malloc supaya anda boleh memperuntukkan
memori semasa runtime.
>> Sentiasa ingat untuk memeriksa null kerana malloc akan kembali null
jika ia tidak dapat memperuntukkan ingatan.
Mari kita mengatakan bahawa anda meminta yang tidak masuk akal jumlah memori.
Komputer anda tidak akan menjadi mampu memperuntukkan sebanyak itu.
>> Jadi malloc hanya akan untuk kembali null.
Jadi sentiasa ingat untuk memeriksa jika penunjuk bahawa anda mendapat dari malloc adalah
batal atau tidak kerana, jika ia adalah, anda mungkin akan penyahrujukan penunjuk dan
menyebabkan kerosakan sampingan.
Dan akhirnya, jangan lupa memori anda.
>> Malloc mewujudkan ingatan dalam timbunan itu.
Dan anda perlu untuk membebaskan memori sebelum program berakhir.
OK, itu sahaja bagi saya.
Maaf, Rob.
Terima kasih.
>> [Tepuk tangan]
>> LUCAS: Mana-mana soalan lepas sebelum Rob datang?
Tidak?
Yeah?
>> PENONTON: Saya tidak melihat ini satu talian.
Telah anda muat naik lagi?
>> LUCAS: Saya rasa Dave adalah memuat naik tidak lama lagi.
>> DAVE: Ia akan disiarkan.
>> LUCAS: Ia akan berada dalam talian.
>> PENONTON: Terpulang.
>> LUCAS: Terpulang?
OK.
Yeah?
>> PENONTON: [didengar]?
>> LUCAS: Ya, anda perlu membebaskan semua memori yang dimasukkan ke dalam timbunan itu.
>> PENONTON: [didengar]?
>> LUCAS: Ya.
Bila-bila masa yang anda mempunyai malloc budaya, anda perlu mempunyai budaya yang bebas
selepas anda berhenti menggunakan pembolehubah itu.
Jadi malloc dan percuma sentiasa bersama-sama.
Rakan-rakan mereka yang terbaik.
Yeah.
Rob?
>> ROB: Saya akan pergi dengan cepat.
Dan juga video yang akan diletakkan.
Saya mempunyai mikrofon pada.
>> OK, jadi minggu lima barangan.
Perkara pertama yang kita perlu adalah tindanan.
Jadi ingat bahawa hanya ada satu stack bingkai setiap panggilan fungsi aktif.
Kita akan melihat bahawa dalam saat.
Dan juga ingat apa yang sebenarnya pergi dalam setiap bingkai tindanan akan menjadi
pembolehubah tempatan fungsi kami, hujah-hujah yang berlalu ke kami
fungsi, bersama-sama dengan pasangan perkara-perkara lain yang anda tidak benar-benar
perlu bimbang tentang.
>> Jadi di sini adalah satu contoh di mana program, notis, utama printfing pulangan
nilai foo 4.
foo hanya akan mengembalikan nilai bar 4 koma 6.
Dan bar akan menetapkan beberapa tempatan n pembolehubah sama dengan 4 kali 6.
Dan kemudian kembali n.
>> Jadi mari kita lihat timbunan sepanjang lelaran sebenar program ini.
Jadi ada bahagian bawah timbunan kita.
Ingatlah bahawa tindanan membesar.
Jadi di bahagian bawah timbunan kami, kami mempunyai bingkai tindanan untuk utama.
Apabila program ini bermula, utama sentiasa akan berada di
bawah timbunan kita.
>> Dan apa yang di dalam kita stack rangka untuk utama?
Jadi walaupun tiada tempatan pembolehubah utama, seperti yang saya katakan sebelum ini,
kami telah argc dan RGV mengambil ruang bahagian dalam bingkai tindanan utama.
Jadi utama kini akan memanggil fungsi foo itu.
Dan itu bererti foo akan dapatkan rangka timbunan sendiri.
>> Jadi sekarang kita di dalam yang foo fungsi.
Dan apa yang perlu ada dalam bingkai tindanan foo ini?
Nah, foo mempunyai hujah n.
Dan n adalah sama dengan 4 sejak itulah yang utama berlalu sebagai hujah foo ini.
>> Jadi sekarang foo akan memanggil bar.
Apa yang bar akan mempunyai di dalam bingkai tindanan sahamnya?
Ia mempunyai x sama dengan 4 y sama dengan enam.
Bukan itu yang kita akan mempunyai dalam bingkai tindanan kerana bar
juga mempunyai pembolehubah n tempatan.
Dan n kita akan ditetapkan sama dengan 24.
>> Jadi sekarang bar akan kembali n.
Jadi bar kembali 24 hingga yang foo bingkai tindanan.
Dan kerana bar kini kembali semula, yang bermakna kita muncul bingkai tindanan
untuk bar kira tindanan.
Jadi semua memori yang bar telah menggunakan kini off tindanan.
>> Sekarang, foo juga akan untuk kembali 24 hingga utama.
Jadi sekarang foo yang kembali, memori foo yang menggunakan dalam 'yang
bingkai tindanan juga hilang.
Dan sekarang, utama akan memanggil printf.
Jadi printf hanya fungsi yang lain.
Apabila kita panggil printf, ia akan menjadi lain bingkai tindanan untuk printf yang
panggilan fungsi.
>> Apa yang kita lulus printf?
Itulah apa yang akan pergi pada frame timbunan itu.
Sekurang-kurangnya, kami lulus peratus yang i backslash n dan
hujah 24.
Ia mungkin mempunyai lebih banyak ia bingkai tindanan printf jika berlaku akan menggunakan beberapa
pembolehubah tempatan.
Kita tidak tahu.
>> Tetapi apa yang masuk dalam printf ini stack bingkai.
Ia akan melaksanakan printf itu.
Kemudian printf dilakukan.
Ia akan kembali.
Akhir sekali, utama dilakukan.
Utama akan kembali.
Kemudian program kami dilakukan.
Yeah?
>> PENONTON: Adakah anda melihat [didengar]
hujah [didengar]
parameter?
>> ROB: Jadi terdapat perbezaan halus antara hujah dan parameter.
Dan benar-benar, dalam bercakap biasa, orang cenderung hanya campuran mereka sepanjang masa.
Tetapi parameter formal menamakan satu perkara.
>> Jadi argc dan argv adalah parameter utama.
Hujah adalah apa yang anda benar-benar lulus dalam seperti orang-orang parameter.
Jadi di sana apabila saya menyeru foo 4, 4 adalah hujah yang saya lulus dalam.
Dan parameter n, di dalam foo, mengambil pada nilai 4
sejak 4 adalah hujah.
>> PENONTON: [didengar]?
>> ROB: n adalah pembolehubah tempatan bagi menghalang.
n masih tempatan untuk foo, tetapi ia adalah parameter kepada foo.
Ia bukan satu pembolehubah tempatan.
Yeah?
>> PENONTON: [didengar]?
>> ROB: bar foo hanya memanggil dan kembali apa bar pulangan.
>> PENONTON: [didengar]?
>> ROB: Ya, hanya untuk melihat pelbagai stack bingkai.
Yeah?
>> PENONTON: Mengapa foo dipanggil sebelum printf?
>> ROB: Mengapa foo dipanggil sebelum printf?
Jadi saya boleh mempunyai, sebaliknya, melakukan sesuatu seperti int x sama foo 4
dan kemudian x dicetak.
Tetapi sebaliknya, saya menggabungkan fungsi panggilan ke hujah printf itu.
>> Tetapi melihat bahawa kita tidak boleh benar-benar melaksanakan panggilan untuk printf sehingga kita
memikirkan apa foo 4 adalah.
Jadi, kita akan menilai ini.
Dan hanya sekali yang dilakukan akan untuk kembali dan menilai ini.
Yeah?
>> PENONTON: Oleh kerana kedua-dua bar [didengar]
nilai, mengapa kita tidak mempunyai [didengar]?
>> ROB: Mereka benar-benar harus int.
Yang tidak ditangkap lebih pelbagai laluan.
Jadi ia harus bar dan int int foo kerana kedua-dua orang-orang
kembali integer.
Tidak sah hanya jika mereka tidak akan untuk kembali nilai-nilai sebenar.
Yeah?
>> PENONTON: Jika anda mempunyai garis di atas penyata itu, [didengar]?
>> ROB: Satu barisan di atas pulangan?
>> PENONTON: Yeah.
Seperti jika anda lakukan printf dan [didengar], ia akan mencetak dua kali?
>> ROB: Jadi bahagian dalam foo?
Jika kita mempunyai printf hak di sini?
>> PENONTON: Yeah.
>> ROB: Jadi, jika kita mempunyai hak printf di sini, ia akan mencetak sekali.
Oleh kerana kita memanggil foo sekali hak sini, maka kita akan terkena printf itu.
Maka kita akan panggil bar.
Dan kemudian foo akan kembali.
Dan itu sahaja.
Kami hanya pernah menghadapi printf sekali.
Yeah?
>> PENONTON: [didengar]
printf memanggil foo kerana kami pertama memanggil printf dan kemudian kita lulus
hujah-hujah.
>> ROB: Jadi, dalam teori, tidak printf memanggil foo?
Jadi tidak.
Hanya perintah yang c akan melaksanakan perkara-perkara ini adalah, sebelum kita boleh
memanggil fungsi, semua hujah-hujah ke fungsi yang perlu
dinilai sepenuhnya.
Jadi ini adalah dinilai sepenuhnya?
Ya, ia hanya rentetan.
Ia hanya nilai.
>> Maka kita perlu benar-benar menilai ini.
Setelah ini dilakukan, kini semua hujah-hujah yang dinilai.
Dan sekarang kita boleh membuat panggilan untuk printf.
Yeah?
>> PENONTON: Satu soalan.
Jika anda mempunyai fungsi tidak sah, mesti anda mempunyai pulangan koma bernoktah?
>> ROB: Anda tidak koma bertitik pulangan jika anda mempunyai fungsi tidak sah.
OK.
Jadi sekarang beberapa barangan timbunan.
Jadi tumpukan ialah bagaimana kita akan menangani dengan pengurusan ingatan dinamik.
Dan ini berbeza langsung dengan timbunan yang mana kita panggil automatik
pengurusan ingatan.
>> Jadi pada timbunan, anda tidak benar-benar mempunyai untuk menangani bagaimana pembolehubah tempatan
terpaksa masuk dan muncul diskaun semua ini bingkai tindanan dan semua barangan itu.
Anda tidak perlu bimbang mengenainya.
Ia secara automatik.
Jadi timbunan itu manual.
Dan [didengar]
datang daripada fungsi-fungsi ini malloc dan percuma.
>> Jadi di sini adalah satu lagi program.
Semua yang kami lakukan adalah mallocing integer.
Kami menyimpannya dalam bintang x.
Sudah tentu, kita perlu menyemak untuk melihat jika x adalah batal.
Kemudian kita akan hanya menetapkan apa x menunjuk ke 50.
Cetak apa x menunjuk ke, x cetak, dan kemudian bebas x.
>> Jadi bagaimana ini sebenarnya akan melihat jika kita melihat timbunan dan timbunan kita?
Jadi kita akan bermula sekali lagi.
Bahagian bawah timbunan kami seperti dahulu.
Ingatlah bahawa kamu lalu ditimbunkannya secara langsung menentang tindanan?
Jadi, kita akan mempunyai atas timbunan kami di sana.
>> Jadi bahagian bawah timbunan kami, kami mempunyai bingkai tindanan kami untuk utama.
Ia mempunyai ruang untuk argc, argv, dan kami kini mempunyai x pembolehubah tempatan, yang
adalah bintang int.
Jadi kita akan melelar melalui program ini.
Perkara pertama yang kita ada adalah panggilan kepada malloc.
>> Jadi, kita membuat panggilan kepada malloc.
Malloc adalah fungsi.
Ia akan mendapatkan bingkai tindanan.
Apa yang kita berpindah kepada malloc?
Itu akan masuk ke dalam bingkai tindanan.
Kami lulus saiz n, iaitu 4.
Supaya diluluskan untuk malloc.
>> Apakah malloc lakukan?
Ia menangkap kami sedikit ruang pada timbunan itu.
Jadi, kita akan pergi ke timbunan itu.
Dan kita akan merebut 4 bait dari timbunan itu.
Jadi mari kita hanya memberi yang alamat sewenang-wenangnya.
0x123 Hanya berpura-pura bahawa adalah alamat yang ada di timbunan itu.
>> Jadi apa yang sebenarnya di dalam itu rantau memori di alamat Ox123?
Sampah.
Oleh itu, kita telah tidak disimpan apa-apa di dalamnya.
Jadi sebagaimana yang kita tahu, ia boleh menjadi apa-apa.
Anda tidak harus menganggap ia sifar.
Ia paling tidak mungkin sifar.
>> Pulangan Jadi sekarang malloc.
Dan apa yang kita lakukan apabila malloc pulangan?
Kami menetapkan apa yang ia kembali.
Kami menetapkan x sama dengan apa yang ia kembali.
Jadi apa yang ia kembali?
Ia kembali 0x123 sejak iaitu alamat blok memori yang ia
hanya diperuntukkan dalam timbunan itu.
>> Jadi kembali 0x123 x kini akan ditetapkan sama dengan 0x123 yang, bergambar,
kita sering menarik kerana x mempunyai sebenar arrow menunjuk ke blok itu.
Tetapi x hanya menyimpan alamat itu.
Jadi sekarang kita perlu memeriksa jika x adalah batal.
Ia bukan null.
Kami berpura-pura bahawa malloc yang berjaya.
>> Jadi sekarang bintang x sama 50.
Jadi bintang ingat ia bermakna pergi ke alamat itu.
Jadi 0x123 Kami akan pergi ke alamat itu.
Justeru, berbalik di sana.
Apa yang kita lakukan di alamat itu?
Kami menyimpan 50.
>> Jadi selepas baris ini, itulah yang perkara-perkara yang akan kelihatan seperti.
Jadi sekarang ia tidak lagi sampah di sana.
Sekarang kita tahu bahawa 50 adalah kerana alamat tertentu kerana
kita menetapkannya untuk itu.
OK?
Jadi sekarang kita akan mencetak f.
>> Oleh itu kita akan mencetak bintang x.
Jadi apa yang adalah bintang x?
Sekali lagi, bintang x bermakna pergi ke perkara yang x menunjuk ke.
Jadi x menyimpan 0x123 Pergi ke itu.
Kita mendapat 50.
Jadi mencetak f itu.
Dan itu bererti ia akan mencetak 50.
Dan kemudian yang mengembalikan.
>> Dan kemudian kita mempunyai printf kedua.
Kami kini peratus p.
Jika anda tidak melihat, itu bagaimana anda mencetak penunjuk.
Jadi kita mempunyai peratus i, peratus f, dan semua orang-orang sudah.
Jadi peratus p, mencetak penunjuk.
>> Jadi x adalah penunjuk.
Jadi jika kita akan mencetak x sendiri, kami mencetak apa yang sebenarnya di dalam
x, yang adalah 0x123 Jadi yang pertama cetak f akan mencetak 50.
Cetakan kedua f akan untuk mencetak 0x123 Yeah?
>> PENONTON: Adakah anda menggunakan peratus x mencetak penunjuk?
>> ROB: Jadi anda menggunakan peratus x mencetak penunjuk?
Jadi anda boleh tetapi peratus x adil, secara amnya, untuk seperti jika anda mempunyai beberapa
integer dan anda ingin cetak sebagai perenambelasan a.
Itu hanya cara melakukannya.
>> Manakala peratus akan d mencetak sebagai perpuluhan.
Itu adalah Kami mendapatkan peratus d. i hanya integer.
p peratus adalah khusus untuk petunjuk.
>> Jadi x adalah penunjuk.
Kami mahu menggunakan peratus p.
Tetapi peratus x boleh bekerja.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Ya.
Sekurang-kurangnya untuk ini call-- jadi saya tidak memasukkannya di sini.
Tetapi kedua-dua hujah yang semestinya bahagian dalam bingkai tindanan ini
bersama-sama dengan apa-apa pembolehubah tempatan printf berlaku akan menggunakan.
Kemudian panggilan di sebelah printf kini bahagian dalam printf bingkai tindanan adalah
peratus p backslash n dan apa sahaja yang Nilai x ialah, yang 0x123.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Ia akan mencetak sesuatu yang kelihatan seperti ini.
>> PENONTON: [didengar].
>> ROB: Jadi yang akan dipaparkan dalam bentuk alamat.
Ia kelihatan seperti alamat.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Kenapa apa?
>> PENONTON: [didengar]?
>> ROB: Mengapa pointer 4 bait?
Jadi, terdapat sejumlah besar 0 di depan ini.
Jadi ia benar-benar 0x0000000123.
Pada sistem 64-bit, akan terdapat sejumlah besar lagi sifar.
Yeah?
>> PENONTON: [didengar].
>> ROB: Jadi printf pertama akan print--
>> PENONTON: [didengar].
>> ROB: Ya, ia akan mencetak apa x menunjuk ke.
Bintang berkata apa yang ini Perkara yang menunjuk ke.
Merebutnya.
Jadi apa yang ia menunjuk ke?
50.
Merebutnya.
Itulah apa yang kita akan mencetak.
Manakala, yang seterusnya, kami hanya mencetak x sendiri.
Maksud yang terkandung dalam f?
0x123.
OK.
>> Dan kemudian, akhirnya, kita mempunyai percuma.
Apa yang kita lulus untuk membebaskan?
Kami x lulus.
Itulah kali saya sebenarnya dipaparkan dalam bingkai tindanan.
>> Jadi, kita lulus nilai 0x123 untuk membebaskan.
Jadi sekarang percuma tahu, semua hak, Saya perlu pergi ke timbunan itu
dan percuma memori itu.
Ia tidak lagi menggunakan apa yang adalah di alamat 0x123.
>> Jadi percuma akan melepaskan bahawa dari timbunan itu.
Sekarang kita tumpukan kosong lagi.
Kami tidak mempunyai sebarang kebocoran memori.
Kini bebas akan kembali.
Perhatikan bahawa x masih 0x123.
Tetapi itu kini tidak memori sah.
Kita harus dereference tidak lagi x.
Yeah?
>> PENONTON: Apakah kembali 0 berlebihan?
>> ROB: Apakah returen 0 berlebihan?
Ya.
Kami hanya meletakkan bahawa di sana kerana kita mempunyai pulangan satu untuk udara.
Jadi rasanya, ya, membolehkan termasuk pulangan 0.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Jadi selepas x percuma, apa yang berlaku jika kita cuba untuk dereference penunjuk?
Ia mungkin bahawa apa-apa berlaku.
Ada kemungkinan bahawa kita masih akan mendapat 50.
>> Ia mungkin juga, bahawa memori yang kini digunakan untuk sesuatu yang lain.
Jadi ia tingkah laku undefined.
Dan undefined bermakna apa-apa boleh berlaku.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Tidak, jadi jika anda menetapkan x kepada sesuatu yang lain.
Jadi, jika di sini kita kata x sama sesuatu malloc else--
saiz malloc event--
maka blok asal memori tidak dibebaskan.
Dan kita telah secara rasmi hilang.
Itulah kebocoran memori.
Kami telah kehilangan semua rujukan dengan blok ingatan.
Jadi tidak ada cara kita yang dapat membebaskannya.
OK, jadi kemudian kembali 0 cara dilakukan.
>> Baiklah, jadi limpahan timbunan.
Apakah idea yang di sini?
Jadi ingat, longgokan akan turun.
Stack adalah naik.
Jadi ini adalah contoh dari kuliah, Saya fikir, di mana utama hanya akan
memanggil fungsi ini foo, yang akan untuk memanggil sendiri secara rekursif alih dan
lagi.
>> Jadi bingkai tindanan akan bekerja sama.
Jadi, kita akan bermula dengan utama sebagai bingkai tindanan bawah.
Kemudian utama akan memanggil foo, yang akan mendapatkan bingkai tindanan.
>> Kemudian foo akan memanggil foo sekali lagi, yang akan mendapat
lain bingkai tindanan.
Dan sekali lagi, dan sekali lagi, dan sekali lagi, dan lagi, sehingga akhirnya, kami menjalankan
ke dalam timbunan itu.
Jadi ini adalah bagaimana kita mendapatkan limpahan timbunan.
Dan pada ketika ini, anda SEG bersalah.
Atau anda akan benar-benar seg kesalahan sebelum ketika ini tetapi yeah.
>> PENONTON: Apakah teras membuang sama seperti seg bersalah?
>> ROB: Jadi, anda akan melihat segmentasi bersalah teras dibuang.
Anda mendapat tempat pembuangan teras apabila anda SEG bersalah.
Dan ia seperti tempat pembuangan daripada semua kandungan memori semasa anda supaya
yang anda boleh cuba dan mengenal pasti mengapa anda SEG disalahkan.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Jadi satu cara segmentasi bersalah ada limpahan timbunan.
Jadi tidak semestinya.
A kesalahan segmentasi bererti bahawa anda memori menyentuh dengan cara yang
anda tidak sepatutnya.
Jadi salah satu cara untuk berlaku iaitu, apabila anda tindanan limpahan, kita mula menyentuh
memori dengan cara yang kita tidak perlu.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Jadi bahagian dalam gelung tak terhingga.
Seperti, ini adalah seperti tidak terhingga rekursif gelung dan dengan itu kita mendapat satu lagi
stack bingkai setiap kali.
Tetapi di dalam tetap infinit one--
baik, mari kita tidak mencetak f--
melakukan sesuatu.
Apa sahaja.
>> Kami tidak akan mendapat lain bingkai tindanan.
Kami hanya akan menyimpan gegelung lebih arahan ini tunggal.
Tindanan tidak berkembang.
Ia adalah fakta bahawa setiap rekursif panggilan memberi kita bingkai tindanan.
Itulah sebabnya kita akan mendapat limpahan timbunan.
Yeah?
>> PENONTON: Jadi, jika anda berkata untuk mendapatkan manakala gelung dan kemudian [didengar]?
>> ROB: Jadi, jika di dalam gelung sementara terdapat printf, anda masih akan
bersalah tidak seg.
Saya hanya tidak mahu untuk mengelirukan perkara.
Ia akan gelung.
Anda akan mendapat timbunan tunggal bingkai untuk printf itu.
>> Kemudian printf akan kembali.
Maka lebih gelung lagi.
Anda akan mendapat timbunan tunggal bingkai untuk printf itu.
Ia akan kembali.
Kerangka timbunan tunggal.
Jadi, anda tidak mendapat ini tak terhingga cerucuk bingkai tindanan.
>> PENONTON: [didengar]?
>> ROB: Ya.
Jadi limpahan timbunan ini berlaku kerana semua ini
panggilan ke foo kembali.
Jadi, jika kita kembali, maka kita akan mula kehilangan bingkai tindanan.
Dan kemudian kita tidak akan tindanan limpahan.
Dan itulah sebabnya anda memerlukan kes asas untuk fungsi peribadi anda.
Yeah?
>> PENONTON: Apakah saiz dan potensi stack untuk timbunan itu yang sama untuk
semua program?
>> ROB: Kira-kira.
Adakah saiz potensi tindanan dan timbunan itu yang sama untuk semua program?
Secara kasar.
Terdapat beberapa rawak untuk di mana timbunan mula dibina dan
di mana timbunan itu bermula.
Jika anda kebetulan mempunyai banyak keseluruhan pembolehubah global dan perkara-perkara, anda mungkin
mengambil dari beberapa ruang untuk timbunan anda.
>> Pada sistem 64-bit, anda hampir mempunyai memori yang tak terhingga.
Terdapat hanya begitu banyak.
Di antara 32 bit dan 64 bit, yang perbezaan yang signifikan.
>> Anda akan mendapat banyak seluruh lebih stack dan ruang timbunan pada 64-bit
sistem kerana ada hanya lebih alamat yang boleh digunakan.
Tetapi pada sistem individu, ia akan secara kasarnya jumlah yang sama stack
dan ruang timbunan.
Baiklah.
>> Jadi perkara terakhir adalah kompilasi.
Jadi, anda perlu tahu proses ini.
Terdapat empat langkah-langkah yang besar.
Jadi yang pertama perlu mudah untuk diingati.
Pra-pemprosesan.
Ia mempunyai awalan pra di dalamnya.
Jadi ia datang sebelum segala-galanya.
>> Perkara yang perlu diingat ialah hash.
Jadi hash mentakrifkan dan hash termasuk dalam semua daripada mereka.
Mereka semua adalah pra-pemproses arahan.
Ini adalah perkara-perkara yang pra-pemproses menjaga.
>> Jadi apakah pra-pemproses lakukan?
Ia satu perkara yang benar-benar dalam keadaan sihat.
Semua itu mampu semua ini menyalin, dan dipotong, dan tampal operasi.
>> Jadi hash termasuk standard i0 dot h.
Apakah yang melakukan?
Ia menyambar standard i0 dot h memfailkan dan paste ia ke dalam bahagian atas
mana-mana jua kata hash termasuk standard dot h i0.
>> Dan mana-mana hash menentukan bahawa kita perlu lihat, apa yang yang melakukan?
Yang menyalin nilai yang hash ditakrifkan ditakrifkan sebagai dan menampal yang
di mana-mana anda menggunakan nilai.
Jadi prapemproses yang hanya tidak benar-benar operasi berasaskan teks yang mudah.
Ia tidak apa-apa pintar.
Jadi semua yang lain adalah lebih rumit.
>> Jadi sekarang prapemproses yang dilakukan, kita sebenarnya mengumpul.
Jadi apakah menyusun maksudkan?
Kami sedang pergi dari c kod kepada kod pemasangan.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Ya, kami ditangkap itu.
Jadi menyusun.
Kami pergi dari c untuk pemasangan.
Jadi ini adalah satu perubahan bahasa sebenar.
Menyusun sendiri bermakna pergi dari bahasa peringkat tinggi untuk
bahasa peringkat rendah.
>> Dan c adalah bahasa peringkat tinggi berbanding pemasangan.
Apakah perhimpunan?
Arahannya yang, cantik banyak, dibuat untuk CPU anda.
Tetapi komputer anda masih tidak tidak faham pemasangan.
Ia hanya memahami satu dan sifar.
Jadi langkah seterusnya adalah pemasangan yang membawa kita dari arahan ini yang
CPU anda memahami dan benar-benar diterjemahkan mereka, untuk
orang-orang dan sifar.
>> Jadi C untuk pemasangan kepada perduaan.
Tetapi saya tidak mempunyai laksana lagi.
Jadi berfikir perpustakaan cs50 itu.
Kami telah menyediakan anda dengan binari untuk ini perpustakaan cs50, yang mempunyai GetString
dan GetInt dan semua itu.
>> Tetapi cs50 library--
di dalam dan dengan itself-- tidak laku.
Ia tidak mempunyai fungsi utama.
Ia hanya sekumpulan binari yang boleh anda gunakan.
Jadi menghubungkan ialah bagaimana kita membawa bersama-sama semua fail-fail binari yang berbeza
menjadi sebuah laku sebenar.
Salah satu yang anda boleh menaip dot dot mengurangkan keluar.
>> Jadi ini adalah seperti fail yang anda menulis, - apa sahaja program anda is--
Ceaser dot c.
Tetapi kini ia telah disusun turun ke binari.
Jadi Ceaser dot o.
Dan ini adalah cs50 kami pustaka binari.
Dan mereka yang digabungkan boleh laku ke dalam tunggal.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Jadi pertama termasuk, ingat, hash termasuk sebenarnya adalah
langkah pra-pemproses.
Tetapi itu berasingan.
Jika anda tidak menggunakan apa-apa fungsi yang berada di luar fail anda itu,
tidak, anda tidak perlu untuk menghubungkan apa-apa kerana anda mempunyai segala-galanya.
>> Yang berkata, printf adalah dikaitkan dalam.
Jika anda pernah menggunakan printf, itu sesuatu yang perlu dikaitkan dalam
kerana anda tidak menulis itu.
Dan, sebenarnya, printf secara automatik dikaitkan dalam.
Anda tahu bagaimana di baris arahan atau apabila anda menaip membuat, anda melihatnya mempunyai
dash l cs50, yang mempunyai link di perpustakaan cs50 ini?
Printf, dan barangan seperti itu, akan ada kaitan secara automatik.
Apa-apa soalan lain pada apa-apa?
>> PENONTON: [didengar]?
>> ROB: Menghubungkan?
Kami mempunyai sejumlah besar fail binari yang berbeza.
Ini adalah contoh berkanun yang kita gunakan adalah perpustakaan cs50.
Kami telah disusun dan diberikan kepada anda binari untuk perpustakaan cs50 ini.
>> Anda mahu menggunakan GetString dalam program anda.
Oleh itu, anda pergi dan menggunakan GetString.
Tetapi tanpa kod binari saya untuk GetString, apabila anda menyusun kod anda
ke bawah, anda tidak boleh benar-benar berjalan anda program kerana GetString String adalah
belum sepenuhnya ditakrifkan.
>> Ia hanya apabila anda menghubungkan dalam binari saya yang mengandungi GetString yang sekarang, semua
betul, saya boleh sebenarnya melaksanakan GetString.
Fail saya selesai.
Dan saya boleh menjalankan ini.
Yeah?
>> PENONTON: Adakah menukar kanji sagu binari untuk laku?
Jadi, walaupun anda tidak mempunyai lain-lain perpustakaan, tidak akan ia masih
perlu untuk menterjemahkan yang [didengar]?
>> ROB: Jadi laksana masih dalam perduaan.
Ia hanya menggabungkan keseluruhan sekumpulan binari.
>> PENONTON: Terima kasih banyak.
>> ROB: Tiada masalah.
Apa-apa soalan lain?
Jika tidak, kita semua ditetapkan.
Baiklah.
Terima kasih.
>> [Tepuk tangan]
>> PENONTON: Terima kasih.
>> ROB: Ya.