Tip:
Highlight text to annotate it
X
>> SPEAKER 1 Hi semua orang.
Kami akan memulakan.
Saya fikir orang ramai masih akan untuk menapis masuk
Tetapi demi kepentingan masa, jadi kita boleh mendapatkan kamu keluar dari sini pada masa,
kita akan bermula.
Jadi selamat datang ke CS50 Kuiz 0 tinjauan.
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 tentang kuiz anda berada di cs50.net/quizzes.
Ada beberapa barangan yang cukup baik di sana, lalu kuiz dari 10 lepas
tahun serta maklumat mengenai kuiz ini dan topik
yang akan dilindungi.
Jadi mari kita memulakan.
>> Jadi mungkin kalian akan ingat, yang pertama hari kelas David mempunyai orang-orang di lampu.
Jadi pada dasarnya, semua benda yang di bawah hud komputer ialah
dilakukan dalam perduaan.
Perduaan bermakna apa yang didengari seperti, 0 dan 1 ini.
Ia mempunyai dua nilai-nilai yang boleh diwakili.
>> Jadi sama 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 Binari.
Setiap tempat diwakili dalam asas dua.
Jadi anda menambah 2 kepada 0 kepada 1 kepada 2 sepanjang jalan sehingga.
>> Untuk mengira apa binari anda adalah untuk perpuluhan, anda hanya mengikut persamaan ini
menaip perkara.
Jika anda mempunyai 1 dalam mana-mana tempat-tempat, anda membiak sendiri dengan apa jua
asas ia dalam, menambah ia naik, 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 sama yang 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 terus di bawah hud 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 watak-watak yang biasanya kita lihat dalam
Bahasa Inggeris seperti A, B, C, menekankan, sengkang, dan
apa-apa seperti itu.
Dan ia peta itu kepada nilai ASCII.
Satu nilai ASCII hanya nombor yang boleh difahami oleh komputer anda.
Dan seperti yang anda boleh lakukan tambahan dan penolakan dengan nombor, anda boleh melakukan
mereka dengan nilai-nilai ASCII.
>> Jadi dalam contoh ini, apa yang ini akan mencetak?
Ya, jadi hanya Ruang ruang B ruang C D. Di mana tetikus saya pergi?
Notis 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 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 5.
Jadi bagaimana kita boleh menukar rentetan 5 untuk 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 kepada syarahan satu di mana kita bercakap tentang 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 kita untuk melaksanakan beberapa jenis algoritma.
Sesuatu yang lebih sedikit kompleks daripada hanya aritmetik mudah.
>> Algoritma adalah hanya satu langkah demi langkah set arahan untuk bagaimana untuk melakukan
satu tugas yang tertentu -
hanya suka resipi.
Anda mungkin ingat hari pertama kelas di mana Daud kita mengira bilik
orang dan berapa ramai orang yang berada di dalam bilik.
Anda mungkin digunakan untuk pengiraan satu demi satu.
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 berkata anda nombor untuk orang lain, menambah bahawa
bilangan, dan satu orang duduk.
Dan anda mengulangi itu.
Itulah satu jenis algoritma.
Kami boleh menganalisis bagaimana cekap satu algoritma adalah berdasarkan kepada ia berjalan masa.
Tetapi kita akan bercakap sedikit lebih lanjut mengenai yang kemudian.
>> Jadi semua algoritma boleh juga ditulis dalam kod pseudo.
Pseudokod hanya Bahasa Inggeris seperti sintaksis digunakan untuk mewakili
bahasa pengaturcaraan.
Sebagai contoh, jika kita mahu bertanya pengguna meneka nombor kegemaran saya, kami
mungkin mempunyai kod pseudo seperti itu.
>> Dapatkan yang pengguna meneka.
Jika tekaan adalah betul, beritahu mereka mereka betul, lagi memberitahu mereka
mereka tidak betul.
Dan kod pseudo adalah satu cara mudah mewakili idea atau algoritma.
Jadi sekarang kita mungkin mahu untuk benar-benar menulis ini dalam bahasa yang komputer
mungkin memahami.
Oleh itu, kita boleh menulis kod pseudo dan mentafsir itu ke dalam kod sumber.
>> Setakat ini, kod sumber mestilah mematuhi untuk sintaks tertentu
bahasa pengaturcaraan.
Dan setakat ini, dalam CS50, kami telah telah menggunakan kebanyakannya c.
Jadi ini mungkin Kod sumber untuk c.
Kemudian dalam perjalanan, anda malam datang bersentuhan dengan pengaturcaraan lain
bahasa seperti PHP.
Atau jika anda juga mengambil kelas-kelas lain, anda mungkin melakukan Java, Python, atau OCML.
Tetapi dalam c bahasa program kita, ini adalah bagaimana kita boleh menulis kod sumber untuk
algoritma kod pseudo yang Saya hanya diterangkan sebelum ini.
>> Jadi bagaimana komputer anda sebenarnya faham itu?
Seperti saya katakan sebelum ini, ia hanya benar-benar memahami sifar dan satu.
Jadi bagaimana ia mendapatkan dari sumber yang kod untuk sesuatu yang boleh
faham?
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 boleh taip make.
Jadi apa yang membuat lakukan?
>> Anda boleh menaip make untuk menyusun anda program kerana seseorang -
sesiapa yang menulis p set anda; mungkin David -
mencipta fail make.
Dan itu memberitahu membuat tahu untuk menjalankan anda pengkompil, yang dipanggil bunyi berdering, kehendak yang
kemudian menyusun kod sumber anda untuk objek kod, yang sifar dan satu
bahawa komputer anda memahami.
Tetapi sedikit nanti, kita akan pergi lebih mendalam mengenai penyusun.
>> Jadi ingat Serangga 0, di mana - ya, anda mempunyai soalan?
>> PENONTON: [didengar]?
>> SPEAKER 1: Ya.
Saya fikir mereka sebenarnya perlu berada dalam talian.
Yeah.
>> PENONTON: Apakah ia seperti [didengar]?
>> SPEAKER 1 Ia tidak.
Yang berada di cs50.net/quizzes.
>> PENONTON: Slash kuiz, slash 2013, mengurangkan 0, dan hanya klik melalui
kuiz 2013 dan kuiz 0, mengkaji semula seksyen slaid.
>> SPEAKER 1: Ya, jadi jika anda semua mahu tarik dan melihat ia pada anda
komputer sendiri, itu juga bisa.
Mengatakan bahawa sekali lagi.
>> PENONTON: [didengar].
>> SPEAKER 1: Ya, [didengar] adalah pembolehubah dummy.
Oh, ya?
>> PENONTON: [didengar]?
>> SPEAKER 1: Tiada, mogok tidak berada di peperiksaan.
Maaf, soalan beliau adalah, telah serangan pada peperiksaan.
Dan ia tidak.
Jadi Serangga 0, anda semua harus mempunyai semua dilaksanakan sesuatu menggunakan 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 palsu, hidup atau mati, dan ya atau tidak.
Contoh mudah, sangat mudah, program yang menggunakan Boolean yang
ungkapan di sini.
>> Jadi untuk ungkapan Boolean untuk berguna, kita mempunyai operator Boolean.
Ini adalah pengendali yang boleh digunakan untuk membandingkan nilai-nilai tertentu.
Jadi kita ada 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 begitu berguna melainkan jika kita boleh menggabungkan mereka ke dalam
syarat.
>> Jadi mungkin kalian akan ingat dari awal dan dari p anda menetapkan bahawa kita
mempunyai syarat-syarat.
Mereka, pada dasarnya, seperti garpu dalam logik program anda yang
melaksanakan bergantung kepada sama ada keadaan yang dicapai.
Jadi salah satu syarat bahawa kita mempunyai digunakan banyak kali di dalam kursus ini adalah
jika, kalau, keadaan jika, dan lain.
>> Berikut adalah satu contoh bagaimana anda mungkin menggunakan itu.
Adakah sesiapa yang tahu perbezaan antara hanya menggunakan jika kenyataan semua
jalan ke ayat jika, lain, jika, dan lain digabungkan?
Ya?
>> PENONTON: [didengar].
>> SPEAKER 1: Tepat sekali.
Jadi, jika saya jika semua jalan ke bawah ini cara, walaupun keadaan ini pulangan
benar, ia masih akan terus ujian dua akan datang.
Manakala, dengan lain-jika, lagi satu pernyataan, sekiranya yang kembali benar,
yang lain tidak diuji.
Apa-apa soalan tentang itu?
Sejuk.
>> Jadi anda menggunakan lain jika-of-galanya satu penyata jika anda tahu bahawa ia hanya boleh
menjadi salah satu kes-kes ini.
Oleh itu, kita tahu jika x adalah kurang daripada 0, itu 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, manakala gelung, 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?
>> Kita biasanya menggunakan untuk gelung jika kita tahu berapa kali kita mahu melelar
melalui sesuatu atau berapa kali kita mahu melaksanakan tugas.
Kami menggunakan manakala gelung jika kita memerlukan keadaan adalah benar untuk menjaga berjalan.
Dan kita menggunakan lakukan semasa hampir sama dengan manakala, tetapi kita mahu kod kami untuk menjalankan pada
kurangnya satu masa.
>> Jadi sementara, yang ada di tugasan yang akan sentiasa menjalankan sekurang-kurangnya satu masa.
Manakala, dengan sementara, ia tidak boleh dijalankan di semua jika
keadaan tidak berpuas hati.
Sebarang pertanyaan dengan itu?
>> Jadi struktur untuk gelung.
Kalian semua telah melihat ini.
Anda memulakan ia.
Anda mempunyai beberapa jenis keadaan.
Jadi, sebagai contoh, kita mungkin memulakan sebagai untuk i sama dengan 0.
i adalah kurang daripada 10.
Dan i + +.
Satu yang sangat mudah yang kita lakukan.
>> Untuk gelung sementara, begitu juga, anda mempunyai untuk mempunyai beberapa jenis pengawalan,
beberapa jenis keadaan, dan beberapa jenis kemas kini.
Oleh itu, kita boleh melaksanakan untuk gelung kami juga sebagai gelung semasa menggunakan ini.
Begitu juga dengan do manakala gelung, kita mungkin mempunyai beberapa pengawalan,
melaksanakan sesuatu, mengemaskini, dan kemudian memeriksa keadaan.
>> Jadi sekarang fungsi.
Kami meletakkan semua bersama-sama.
Kita mungkin mahu menulis beberapa jenis fungsi.
Fungsi biasa yang anda mungkin telah melihat sudah adalah utama.
Utama adalah fungsi.
Ia mempunyai jenis balasan, int.
Ia mempunyai nama fungsi, utama.
Dan ia mempunyai hujah, argc dan argv.
Jadi utama hanya satu majlis.
>> Fungsi-fungsi lain yang anda mungkin telah digunakan, printf - printf adalah fungsi yang -
GetInt, toupper.
Tetapi ini berlaku kepada telah dilaksanakan untuk kita oleh
beberapa jenis perpustakaan.
Jika anda semua masih ingat termasuk perpustakaan CS50.h ini atau
standard I / 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: Jadi anda tidak akan [didengar]?
>> SPEAKER 1 No
Apa-apa soalan lain?
Sejuk.
Jadi seperti anda boleh menggunakan fungsi yang yang ditulis untuk anda, anda boleh juga
menulis fungsi anda sendiri.
Ini adalah fungsi yang seseorang mungkin telah menulis untuk mengira jumlah
q, sebagai contoh.
Ada jenis pulangan di sini, dalam kes ini int, nama fungsi kami q dan kami
senarai parameter.
>> Dan ambil perhatian bahawa anda perlu menulis data yang jenis parameter yang anda hendak
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, yang baik untuk organisasi.
Mereka membantu memecahkan kod anda ke dalam lebih teratur 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 penggunaan 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.
Dan kemudian setiap kali anda perlu menggunakan yang sekeping kod, hubungi fungsi.
>> Jadi sekarang jika kita ingat kembali ke awal, kami juga bercakap tentang konsep beberapa,
salah satu yang threading.
Thread adalah konsep pelbagai urutan kod
pelaksanaan pada masa yang sama.
Jadi berfikir kembali kepada satu di mana David mempunyai hari anda semua mengira off bilangan
orang di dalam bilik.
>> Pada asasnya, apa yang berlaku atas adalah anda semua lelaki sedang
berjalan benang yang berasingan.
Dan orang-orang benang telah datang bersama-sama untuk mendapatkan beberapa jenis jawapan.
Begitu juga, dalam Awal, apabila anda mempunyai pelbagai sprites, anda mungkin
mempunyai kucing dan anjing.
Dan mereka akan menjadi pada masa yang sama berjalan skrip mereka sendiri.
Itu adalah satu contoh threading.
>> Dan konsep lain yang diperkenalkan pada awal adalah acara.
Dan peristiwa adalah apabila pelbagai bahagian kod anda berkomunikasi antara satu sama lain.
Dalam Scratch, ini adalah apabila anda menggunakan disiarkan kawalan dan Apabila saya
Terima blok.
>> Dan juga, dalam Set Masalah 4, kita melihat sedikit peristiwa juga.
Mungkin kalian akan telah menggunakan perpustakaan Gevent.
Dan ada fungsi waitForClick di mana anda sedang menunggu
bagi pengguna untuk klik.
Dan klik anda, dalam kes ini, akan menjadi Sekiranya dan tunggu klik adalah anda
acara pengendali.
>> Dan juga, sepanjang berjalan psets anda dan bekerja di psets anda, anda
mungkin telah bersentuhan dengan beberapa arahan ini.
Ini adalah apa yang anda taip ke dalam anda tetingkap terminal atau apa sahaja tingkap
yang akan kelihatan pada g edit anda kepada, pada dasarnya, mengemudi komputer anda.
>> Jadi, sebagai contoh, LS menyenaraikan kandungan direktori.
Buat direktori mencipta folder baru.
CD, direktori perubahan.
RM, mengeluarkan, memadam 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 telah ia hafal.
Yang akan menjadikan kehidupan anda lebih mudah.
Adakah saya menjawab soalan anda?
>> Jadi sekarang, kita bercakap sedikit secara ringkas mengenai perpustakaan.
Tetapi kedua-dua orang-orang yang utama yang kita telah menggunakan setakat ini untuk memasuki kursus ini
standard I / O dan cs50.
Apakah jenis perkara-perkara yang termasuk di perpustakaan I / O piawai?
>> Ya, setakat ini kami telah menggunakan printf.
Dalam cs50, kami telah menggunakan GetInt dan GetString.
Dan tali jenis data juga berlaku untuk 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 memerlukan -
int, 4 bait; char, 1 bait.
Terapung adalah 4 bait.
Apakah dua yang?
>> PENONTON: [didengar].
>> SPEAKER 1: Ya, jadi apungan tetapi dua kali ganda saiz.
Apa kira-kira yang lama?
>> PENONTON: [didengar].
>> SPEAKER 1 OK.
Apakah yang panjang?
>> 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 int satu.
Ia bergantung kepada seni bina sebelum [didengar]
dan int mempunyai saiz yang sama.
[Didengar].
>> SPEAKER 1: Jadi yang panjang dan int an adalah sama.
Dan kemudian yang panjang panjang adalah dua kali ganda int itu.
Sejuk.
Dan kemudian, apa yang adalah jenis yang lepas?
>> PENONTON: pointer.
>> SPEAKER 1: Ya, jadi kita belajar sedikit tentang petunjuk.
Dan tidak kira apa penunjuk adalah menunjuk ke - ia boleh menjadi bintang char
atau bintang int -
ia sentiasa 4 bait untuk penunjuk.
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.
>> SPEAKER 1 Yeah.
Demikian maka yang panjang panjang adalah dua kali ganda 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 dengan andaian
seni bina seperti perkakas.
Untuk 64 bit, perkara-perkara sahaja yang 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 akan yang ditentukan dari int [didengar]?
>> SPEAKER 1: tidak ditandatangani dalam juga 4 bait.
Tetapi apa yang berbeza tentang yang ditandatangani int dan int tidak?
>> PENONTON: [didengar].
>> SPEAKER 1: Betul.
Satu boleh mewakili nilai-nilai yang 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 kepada yang panjang panjang -
bagaimana adalah bahawa hanya empat bait apabila yang panjang panjang 8 bytes itu.
Jadi ingat apa yang penunjuk, pada dasarnya, pada nilai asas sangat.
>> PENONTON: [didengar].
>> SPEAKER 1: Ya, jadi penunjuk hanya satu lokasi ingatan.
Jadi tidak kira berapa banyak ruang penunjuk yang menunjuk ke.
Ia hanya memerlukan 4 bait untuk mengesan itu lokasi ingatan.
Apa-apa soalan lain?
Sejuk.
>> Jadi perkara terakhir saya mempunyai 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 i untuk int, dan kita juga boleh menggunakan peratus d.
Ia adalah perkara yang sama.
Tetapi, secara amnya, dalam CS50 kita cuba menggunakan peratus i.
F peratus bagi apung.
Ld peratus lama panjang dan peratus kerana tali.
>> Begitu juga, kami telah menggunakan beberapa ini urutan melarikan diri.
Sebagai contoh, garis sendeng terbalik n bagi talian baru.
Ini adalah hanya untuk apabila anda memformat kod anda untuk cetak f.
Ya?
>> PENONTON: Apakah peratus d untuk?
>> SPEAKER 1: Jadi soalan adalah apa yang peratus d untuk?
Peratus d adalah untuk Ints.
Peratus d dan peratus i adalah sama.
>> PENONTON: Apakah perbezaan di antara garis sendeng terbalik n dan garis sendeng terbalik r?
>> SPEAKER 1 Jadi persoalannya ialah apa yang yang Perbezaan di antara tindak balas n dan
tindak balas r?
Saya rasa garis sendeng terbalik r adalah -
>> PENONTON: r Jadi garis sendeng terbalik hanya membayangkan pulangan ke permulaan baris
tanpa benar-benar pergi ke barisan baru.
Jadi, jika anda mencetak satu r garis sendeng terbalik dan anda kembali ke permulaan baris
maka anda mencetak barangan yang lebih, anda menulis ganti barangan yang sudah di
[Didengar].
Manakala, n sebenarnya pergi ke baru talian dan pergi ke [didengar].
>> SPEAKER 1 Nah, mana-mana soalan-soalan lain?
Baiklah.
Saya akan menyerahkan ia di luar untuk Dan yang akan berterusan.
>> [Tepuk tangan]
>> DAN: Semua righty.
Jadi saya akan bercakap tentang satu lagi luas pelbagai idea-idea dari kelas yang
secara kasar wakil minggu dua dan awal minggu tiga bermula dari
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, pelampung untuk Ints, dan
Roh meronta-ronta panjang berganda.
>> Semua perkara ini boleh digunakan sebagai cara merawat beberapa nilai angka
tolak char kerana beberapa lain nilai nombor.
Jadi, terdapat beberapa isu dengan ini, sudah Sudah tentu, yang datang apabila anda membuang
perkara seperti apungan untuk Ints.
Jadi ini adalah sedikit pelik.
Kami mempunyai apungan yang 1.31.
Kami kalikan dengan 10,000.
Dan kemudian kita mencetak sebagai int satu.
Apakah output ini?
10,000 kali 1.31.
Jadi 13,000, ialah meneka?
>> PENONTON: Saya rasa ia 10,000.
>> DAN: Jadi saya mendarabkannya dengan 10,000 sebelum saya pemutus ia.
>> PENONTON: Oh.
Tidak akan ada satu 9 dan ada 0 nombor?
>> DAN: Anda mungkin mempunyai beberapa digit pelik.
Jadi betul, ia 1.3 kali 10,000.
Jadi, itu 13,000.
Dan ini tambahan pelik -
>> PENONTON: 13,100.
>> DAN: 13,100.
Terima kasih, Rob.
Dan weirdness tambahan ini -
9,9 ini -
adalah semata-mata kerana pemutus ini berakhir pembundaran turun di mana
ia tidak sepatutnya.
Yeah.
>> PENONTON: pemutus ini berlaku selepas apa-apa lagi?
>> DAN: Jadi kerana saya mempunyai ini di cetak, ia tidak 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 13,099.
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
beberapa 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
menjadi rendah sedikit.
Masuk akal?
OK.
>> Sekarang, dihidupkan adalah cara yang berbeza melakukan kenyataan bersyarat di mana semua
kita mengambil berat tentang adalah pembolehubah tunggal.
Jadi dalam contoh ini tertentu, kami mendapat integer dari pengguna.
Dan kemudian kami melihat apa integer iaitu.
Mungkin, ia adalah nombor antara satu dan empat.
Itulah apa yang kita minta.
>> Jadi, anda melakukan suis nama berubah-ubah.
Kemudian anda menetapkan kes mungkin nilai yang boleh.
Jadi dalam hal keadaan kes satu, mengatakan ia rendah.
Dan kemudian anda memecahkan untuk keluar keadaan suis supaya
anda tidak menyimpan berterusan.
>> Dalam kes yang akan datang -
jadi kes dua dan kes tiga -
jika ia kes dua ia hanya jatuh ke baris pertama kod ia melihat sebagai dengan
dalam hal keadaan kes tiga sehingga ia melihat rehat.
Jadi sebab anda mendapatkan kes seseorang untuk hanya cetak rendah adalah kerana saya
mempunyai rehat ini di sini.
Jika saya, katakan, diabaikan rehat ini - jika saya melemparkan memisahkan diri ini -
ia akan mencetak rendah, dan kemudian ia akan mencetak tengah, dan maka ia akan pecah.
>> Jadi rehat merupakan bahagian penting daripada menukar syarat-syarat dan
mereka perlu berada di sana.
Apa-apa kes-kes yang tidak dinyatakan dengan jelas dikendalikan oleh lalai
dalam hal keadaan kes di suis dan perlu diperbaiki.
>> PENONTON: Jadi 1, 2, 3, dan 4 akan n?
>> DAN: Nilai-nilai yang n boleh.
Ya.
Yeah?
>> PENONTON: Oleh itu, apabila anda mempunyai yang [didengar]?
>> DAN: Anda akan mencetak rendah, dan kemudian ia akan mencetak tengah dan
maka ia akan pecah.
>> PENONTON: Mengapa ia akan mencetak tengah jika [didengar]?
>> DAN: Jadi semuanya di bawah kes yang sebelum berehat jatuh di bawah.
Jadi kes salah cetak adalah kes di bawah satu sebagai adalah cetak ini berikut.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Jadi nombor ini hanya tertentu nilai yang berubah-ubah ini
boleh mengambil, bukan?
Adakah ini masuk akal?
Yeah.
>> PENONTON: [didengar]?
>> DAN: Ya, kes dua akan mencetak pertengahan dan kemudian pecah.
>> PENONTON: [didengar]?
>> DAN: Saya rasa apa-apa?
Apakah jenis data lain anda boleh beralih?
>> PENONTON: Anda boleh menukar atas mana-mana jenis data.
Tetapi ia bererti apa-apa lebih aksara dan Ints dan barangan seperti itu, kerana
jika anda beralih penunjuk yang tidak masuk akal,
beralih beban, sekiranya ia mari kita anda lakukan itu, kerana titik 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 adalah sebenarnya berguna.
Baik?
OK.
>> Skop adalah pelbagai yang diisytiharkan ubah memanjangkan.
Jadi dalam sebahagian kecil ini kod saya, ia akan menjadi 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 skop yang gelung.
>> Jadi, pada asasnya, anda boleh berfikir tentang skop sebagai apa-apa yang anda mengisytiharkan
dengan di dalam satu set pendakap kerinting hanya wujud di 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 a *.
Mereka betul-betul sama.
Mereka hanya petunjuk kepada watak-watak.
Dan mana-mana tali yang anda mempunyai sepatutnya berakhir dengan garis sendeng terbalik sifar, yang hanya
c konvensyen.
>> Ia dipanggil terminator NULL itu.
Dan NULL -
modal N, modal U, modal L, modal L -
tidak sama sebagai Terminator NULL.
Ini adalah penunjuk.
Ini adalah bersifat.
Mereka sangat berbeza.
Ingat.
Ia akan menjadi kuiz, mungkin.
Saya tidak pernah melihat kuiz.
Yeah?
>> PENONTON: Jadi NULL adalah, katakan, penunjuk?
>> DAN: Ya.
>> PENONTON: Apakah [didengar]?
>> DAN: Jika, berkata, malloc dipanggil apabila anda tidak mempunyai memori yang cukup untuk mendapatkan
apa sahaja saiz yang anda meminta untuk, malloc akan kembali NULL.
Ia, pada dasarnya, setiap kali fungsi adalah sepatutnya kembali penunjuk, anda
perlu menyemak terhadap NULL kerana NULL adalah cukup baik -
ia, jenis, nilai sampah.
Ia sifar sejauh petunjuk pergi.
>> Apabila anda memanggil fungsi, yang mengembalikan penunjuk.
Anda akan mahu untuk memeriksa untuk menjadi memastikan bahawa penunjuk yang tidak NULL
kerana NULL adalah perkara biasa.
Ia jenis pulangan sampah.
Jadi, jika sesuatu tidak pergi betul, hanya kembali NULL sebaliknya.
>> PENONTON: [didengar]?
>> DAN: Ya, dan itu ini.
>> PENONTON: [didengar]?
>> DAN: Eja kerana 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 titik terapung menghargai ke suis, ia akan menjerit pada anda
berkata, kenyataan memerlukan ungkapan jenis integer.
>> DAN: Terdapat anda pergi.
Tetapi yeah, apa yang soalan lagi?
>> PENONTON: [didengar]?
>> DAN: Jadi modal N, modal U, modal L, modal L adalah c perkara sebenar.
Ia adalah penunjuk NULL dan akan hanya diperlakukan sedemikian.
Anda tidak akan pernah cuba dan mengeja Watak NULL dan melihat apa-apa
cara yang lain daripada ini.
Yeah?
>> PENONTON: Jadi kembali ke char maks atau sesuatu dalam nota, akan ia
merangkumi fungsi yang sama sebagai [didengar]?
>> PENONTON: Jadi yang anda merujuk kepada kembali char maks dari getchar, atau
apa sahaja?
>> PENONTON: Yeah.
>> PENONTON: Ya, jadi umum panjang bagi semua perkara
nilai-nilai sentinel.
Jadi seperti kembali int max dari GetInt dan char maks dari getchar, ia
sepatutnya menjadi seperti, baiklah, jika perkara-perkara ini akan kembali kepada kita,
sesuatu yang salah.
>> Untuk petunjuk, kita hanya kebetulan mempunyai nilai sentinel ini yang semua orang
bersetuju atas.
Dan ini adalah perkara yang anda kembali apabila berlaku kesilapan.
Max Jadi char adalah apa yang kita gunakan untuk mewakili sesuatu
seperti NULL atau getchar.
>> PENONTON: Jadi jika anda sedang menguji getchar, boleh anda hanya meletakkan NULL?
Adakah yang membuat perbezaan?
>> DAN: Anda tidak boleh hanya memeriksa NULL.
Anda harus memeriksa max char kerana nilai pulangan dari fungsi tersebut
watak tidak penunjuk.
Yeah?
>> PENONTON: Soalan ini meminta untuk panjang tali.
Adakah itu termasuk watak NULL ini?
>> DAN: No
Dan itulah sebenarnya bagaimana panjang rentetan tahu berhenti kerana ia akan melalui
pelbagai anda watak sehingga ia melihat watak NULL.
Dan kemudian ia seperti, semua betul, aku selesai.
>> PENONTON: [didengar] lima?
>> DAN: Hello berjumlah lima.
Yep.
Jadi tatasusunan adalah berterusan blok ingatan.
Mereka mempunyai akses segera dengan mengatakan yang menamakan array dan kemudian, dalam kerinting
pendakap, apa sahaja indeks anda mahu pergi kepada, mereka diindeks dari sifar melalui
panjang array tolak 1.
>> Dan mereka diisytiharkan oleh jenis yang perkara yang anda menyimpan dalam
array, nama array, dan kemudian apa sahaja 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 sudah dibuat.
Jadi, anda boleh menentukan ini dan bukannya sebagai, berkata, char, apa sahaja nama anda
pelbagai adalah, kurungan kosong sama kerinting pendakap H koma koma E L L koma koma
Watak O koma NULL dan pendakap kerinting.
Yang juga akan bekerja sebagai perisytiharan.
>> PENONTON: [didengar]?
>> DAN: Kemudian anda perlu mempunyai saiz yang sudah dibuat.
>> PENONTON: [didengar]?
>> DAN: Ya.
Semua righty.
Hujah arahan baris adalah satu cara mendapatkan input daripada pengguna sebagai
hujah untuk utama.
Utama mengambil masa dua hujah.
Bilangan hujah yang sedang diluluskan sepanjang baris arahan dan
vektor tali atau pelbagai tali semua hujah-hujah.
>> Jadi jika saya, katakan, yang dipanggil fungsi seperti a dot keluar 1 ruang, 2 ruang, tiga,
argc akan 4.
Dan argv 0 akan menjadi titik keluar.
Argv1 akan 1.
argv2 akan 2. argv3 akan 3, dalam kes tertentu.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Elemen terakhir dalam tatasusunan kerana array adalah argc panjang 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 ialah 2. argv 3 ialah 3.
argv 4, yang merupakan salah satu yang lebih besar daripada argc akan NULL.
>> Dan itulah penunjuk NULL itu.
Ya.
Dan itu kerana tali adalah bintang char adalah penunjuk.
Jadi ia telah menjadi jenis yang sama.
Yeah?
>> PENONTON: Dua soalan.
Jadi satu, apa perbezaan di antara ini dan GetString lain daripada satu jenis
dalam enjin pengguna?
Dan dua, ia disimpan dalam ingatan baru-baru 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 Fungsi anda memanggil hujah itu ini
disimpan dalam tindanan?
Jadi argc dan argv adalah hujah untuk utama dan mereka berada di tepi, atau benar-benar
di atas apa yang anda fikirkan sebagai permulaan tindanan.
Manakah bahagian yang lain soalan ini?
>> PENONTON: Jadi apa yang [didengar]?
>> DAN: Ya, ia hanya cara yang berbeza mendapatkan input daripada pengguna.
Sedikit lebih cekap dan ini seseorang ia handier untuk skrip kerana anda
hanya boleh lulus hujah untuk utama anda fungsi bukannya untuk menunggu
untuk pengguna jika anda tidak mempunyai mana-mana pengguna.
>> PENONTON: Dan yeah, dapatkan tali akan menjadi [didengar].
Ia akan menyimpan barangan yang anda perlukan.
>> DAN: Ya?
>> PENONTON: [didengar]?
>> DAN: Ya, argv 0 sentiasa termasuk slash dot panggilan fungsi.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Ya, setiap satu daripada hujah-hujah yang berakhir dalam watak NULL kerana mereka
adalah wayang.
>> PENONTON: [didengar]?
>> DAN: Ya, argc argv adalah penunjuk NULL.
>> PENONTON: [didengar]?
>> DAN: Ya.
Ya, maaf.
>> PENONTON: Jadi [didengar]?
>> DAN: Jadi persoalannya ialah jika anda mempunyai baris perintah dot slash dot keluar 1, 2,
akan bilangan baris arahan 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 dinyanyikan mengecualikan fungsi dari baris arahan
hujah walaupun ia termasuk dalam argv.
>> DAN: Tetapi jika ia adalah pada ujian -
yeah - dan juga jika anda berkata sesuatu seperti argc bersamaan 3,
anda berada dalam kedudukan selamat.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Saya fikir jika bukannya memanggil ini dalam argc dan tali argv kurungan
tetapi disimpan jenis yang sama dan hanya dipanggil mereka sesuatu yang berbeza seperti
dan b, akan ia masih berfungsi?
Dan ia masih akan bekerja, anda akan hanya -
bukannya menggunakan argc - anda akan menggunakan a dan b.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Jadi soalan itu adalah GetString akan menyimpan memori dalam timbunan itu
kerana GetString adalah char *.
Ia menyimpan memori dalam timbunan itu kerana ia panggilan kini malloc dalam sebenar
pelaksanaan GetString.
OK, beralih.
>> Keselamatan.
Jadi untuk menjadi benar-benar selamat, anda bergantung kepada tidak 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 adalah tidak selamat.
Mereka sebenarnya.
Kita perlu mempercayai orang lain.
>> Dan idea keselamatan adalah bahawa anda cuba untuk menghadkan jumlah
percaya bahawa anda perlukan.
Dan salah satu cara yang anda lakukan yang 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-rahsia ini.
Oleh itu, kita menyulitkan rahsia kami ke dalam cara yang yang kita harap tidak ada yang dapat memikirkan.
>> Jadi kami menggunakan -
melalui perjalanan kelas ini -
perkara seperti Caesar cipher dan [Didengar], yang kedua-duanya sangat, sangat
cara tidak selamat daripada menyulitkan sesuatu.
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 kali anda mempunyai masalah.
Arahan yang berguna dalam GDB adalah memecahkan, yang anda meninggal sama ada garis
nombor, nama fungsi, pada dasarnya di mana dalam kod anda, anda mahu berhenti,
dan dapat mengambil kawalan.
>> Cetak mengambil pemboleh ubah dan akan paparkan apa sahaja yang berubah-ubah yang pada itu
titik dalam pelaksanaan anda.
Seterusnya bergerak pelaksanaan anda sepanjang satu langkah.
Dan langkah langkah-langkah di dalam satu majlis dalam pelaksanaan anda.
>> Perkara-perkara lain yang dijalankan, iaitu bagaimana anda sebenarnya menjalankan kod anda.
Teruskan mengambil semua langkah-langkah yang diperlukan untuk mendapatkan ke titik rehat seterusnya.
Dan ada banyak, banyak lagi.
Melihat mereka.
Mereka yang besar.
Yeah?
>> PENONTON: [didengar]?
>> DAN: Ya, yang penyahpepijat.
Jadi penyahpepijat merupakan 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 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 POINT anda mengatakan bahawa anda tidak dapat mencari
elemen yang anda cari.
Dan ini mengambil masa sekurang-pemalar masa terbaik, yang 0 of 1 dan pada linear terburuk
masa, yang adalah 0 n.
>> Carian binari, yang memerlukan unsur-unsur kotor.
Anda pergi ke tengah-tengah unsur-unsur anda, melihat jika elemen yang anda cari
adalah lebih besar atau lebih kecil daripada unsur bahawa anda berada di tengah-tengah.
Ia itu lebih besar, anda mengatakan bahawa bahagian bawah ruang carian anda adalah anda
lokasi semasa, tengah-tengah, dan anda memulakan semula proses.
Jika ia lebih kecil, anda melihat kata bahawa - yeah, apa khabar?
>> PENONTON: [didengar]?
>> DAN: Ya.
Apa-apa jenis bentuk yang telah diajar di kelas adalah permainan yang adil untuk ujian.
>> [Ketawa]
>> DAN: Dan hakikat bahawa anda tidak mempunyai untuk melakukannya untuk masalah ditetapkan, ia adil
permainan untuk ujian.
>> PENONTON: Bolehkah kita pergi ke ia bagaimana untuk -
>> 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 jenis merge.
Jadi anda tidak perlu untuk melaksanakan sendiri malam ini.
Tetapi pastikan anda memahaminya dan bukan daripada sekadar 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 terdapat
penyelesaian, yang merupakan cantuman pelaksanaan sejenis.
Tetapi pastikan anda memahaminya bukan hanya menghafalnya
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 pilihan jenis atau
jenis sisipan atau apa sahaja.
Satu lelaran penuh dengan senarai.
Jadi, walaupun anda tidak berakhir 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 pelajari, dan
sedikit sedikit semua petunjuk.
OK?
Jadi pertama sekali, rekursi.
Apakah maknanya untuk mengatakan bahawa fungsi adalah rekursif?
>> PENONTON: Panggilan sendiri.
>> LUCAS: OK, panggilan sendiri, ya.
Jadi seperti gambar ini, sebagai contoh.
Ia seperti gambar di dalam gambar dan sebagainya.
Sebagai contoh, anda boleh mempunyai - sebagai Dan yang bercakap tentang carian binari.
Salah satu cara di mana carian binari adalah rekursi adalah hakikat bahawa anda
cuba mencari nombor.
Jadi anda pergi ke tengah-tengah.
Dan kemudian anda menyemak jika nombor-nombor di sana di kiri dan di kanan.
>> Dan kemudian jika anda mengetahui bilangan adalah akan berada di sebelah kiri, ia yang sama
perkara seperti melakukan pencarian lagi tetapi hanya di sebelah kiri senarai.
Jadi itulah bagaimana ia kedengaran seperti ia rekursif.
Jadi itulah sebabnya anda lelaki itu mempunyai rekursi penyelesaian untuk jenis merge.
>> OK, jadi di sini adalah contoh.
Jadi mari kita mengatakan bahawa saya mahu memilih semua nombor 1 hingga n.
Saya boleh sedar bahawa jumlah n nombor adalah n plus n minus 1 sehingga 1.
Tetapi, jika saya melihat n tolak 1 campur n tolak 2 tambah 1, itu yang sama
perkara sebagai menjumlahkan nombor sehingga n tolak 1.
Jadi saya boleh mengatakan jumlah sejumlah yang sama sama n dicampur dengan jumlah bagi n tolak 1.
Adakah ini masuk akal?
>> Dan saya juga akan mempunyai sesuatu yang berlainan dipanggil kes asas, iaitu bahawa
jumlah nombor sehingga kepada sifar akan menjadi sifar.
Jadi sebaik sahaja saya mendapat bilangan 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 mula-mula memeriksa 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 ditambah jumlah nombor
satu hingga n tolak satu.
Masuk akal?
OK.
>> Jadi inilah apa yang kelihatan seperti.
Anda mempunyai jumlah 2 sama 2 dicampur dengan jumlah bagi 1.
Dan beberapa 1 adalah 1 campur jumlah 0, yang adalah 0.
Masuk akal?
Jadi, jika kita melihat timbunan anda program, ini adalah apa yang kelihatan seperti.
>> Pertama, kita mempunyai fungsi utama.
Dan kemudian fungsi utama dipanggil jumlah 2.
Dan maka jumlah *** 2 akan berkata, oh, jumlah *** 2 sama 2 dicampur dengan jumlah bagi satu.
Jadi saya menambah jumlah 1 untuk tindanan.
Dan jumlah 1 akan memanggil jumlah 0, yang juga akan ditambah
untuk timbunan.
Dan kemudian setiap orang-orang yang ini yang di atas yang lain perlu kembali
sebelum-orang yang 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 untuk jumlah 2.
Dan akhirnya, jumlah 2 akan untuk kembali kepada 3 utama.
Adakah ini masuk akal?
>> Ia benar-benar penting untuk memahami bagaimana tindanan berfungsi dan cuba untuk
melihat jika ia masuk akal.
OK, jadi sorting.
Jadi mengapa menyusun penting, pertama sekali?
Mengapa kita perlu mengambil berat?
Sesiapa sahaja?
Beri saya contoh?
Yeah?
>> PENONTON: [didengar].
>> LUCAS: Ya, OK.
Jadi 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 perkataan dalam beberapa jenis supaya kita
boleh mengakses dengan mudah.
Jadi itulah yang dia telah berkata.
Anda boleh mencari lebih cekap.
Fikirkan bagaimana sukarnya adalah untuk mempunyai kamus di mana kata-kata yang di
susunan rawak.
Anda akan perlu untuk melihat, cukup banyak, setiap perkataan tunggal sehingga anda mencari
perkataan yang anda cari.
>> Jika anda menggunakan Facebook juga, apabila anda melihat rakan-rakan anda, anda
akan melihat bahawa Facebook meletakkan anda kawan 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 juga ingat bahawa anda berkawan dengan.
Dan itu kerana macam Facebook rakan-rakan anda berdasarkan bagaimana
jarak anda kepada mereka.
>> Jadi menganjurkan data.
Juga Pokemon.
Jadi anda lihat bahawa semua Pokemons mempunyai nombor.
Dan itu seperti yang mudah cara mengakses data.
>> PENONTON: Mengakses Pokemon.
>> LUCAS: Yeah.
>> PENONTON: [didengar].
>> LUCAS: Ya.
OK, jadi jenis pemilihan.
Jenis Pemilihan akan memilih nilai terkecil Unsorted senarai setiap
masa di 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.
Anda meletakkan ia di dalam senarai disusun.
Dan kemudian anda mencari seterusnya bilangan yang paling kecil.
Dan kemudian anda terus melakukan itu dan sebagainya.
>> Jadi jenis pemilihan adalah pada dasarnya anda pilih setiap kali yang paling kecil
nilai Unsorted.
Letakkan di akhir disusun sebahagian daripada senarai.
Dan terus melakukan itu.
Jadi mari kita lihat apa yang cepat ini kelihatan seperti.
Jadi inilah yang disusun dan senarai Unsorted.
>> Jadi untuk disusun dalam senarai, ia pada mulanya kosong.
Dan kemudian saya akan pilih bilangan paling kecil di sini, yang ialah 2.
Jadi saya mendapat nombor 2 dan saya meletakkan di depan senarai.
Dan kemudian saya mencari yang paling kecil seterusnya elemen, iaitu 3.
Jadi saya meletakkan ia pada akhir senarai disusun.
Dan kemudian saya terus melakukan itu.
Saya mencari 4 dan meletakkannya di hujung.
Cari 5 dan meletakkannya di hujung.
>> Dan melihat bagaimana semua masa-masa yang Yang saya katakan meletakkannya di akhir adalah,
pada dasarnya, bertukar-tukar dua nilai.
OK?
Dan kemudian yang terakhir, anda hanya mempunyai satu elemen lagi.
Jadi ia sudah disusun.
>> OK, jadi jenis sisipan.
Jenis Insertion anda akan perlu juga bahawa perkara yang mempunyai disusun dan
senarai Unsorted.
Satu-satunya perkara adalah bahawa setiap kali anda menambah elemen untuk disusun
senarai, anda hanya memilih elemen yang adalah di hadapan senarai Unsorted.
Dan kemudian anda akan mencari apa yang meletakkan ia harus dalam disusun
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
disusun sebahagian daripada senarai.
Jadi senarai itu tidak mempunyai apa-apa.
Jadi saya hanya boleh meletakkan nombor 3.
>> Sekarang, saya mahu untuk menambah nombor 5 untuk bahagian disusun senarai.
Jadi saya melihat nombor 5.
Saya notis bahawa itu lebih besar daripada 3.
Jadi saya tahu bahawa ia telah menjadi 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 semua cara di awal senarai.
Jadi saya perlu, jenis, beralih semua elemen dalam senarai disusun jadi saya boleh
memberi ruang kepada bilangan 2.
>> Kemudian saya melihat nombor 6.
Saya melihat bahawa ia harus selepas 5.
Jadi saya meletakkan di sana.
Dan akhirnya, saya melihat nombor 4.
Dan saya notis yang sepatutnya antara 3 dan 5.
Dan kemudian saya meletakkan di sana dan peralihan semua unsur-unsur lain.
Masuk akal?
>> Bubble Susun.
Jadi isih gelembung pada asasnya apa yang anda akan lakukan - kita panggil ia gelembung
jenis kerana anda pergi melalui senarai - ia sebenarnya lebih baik jika saya hanya menunjukkan
anda suka ini -
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 disusun akan sebenarnya 6 dan 5, bukan?
Jadi, anda akan menukar pesanan.
Kemudian saya melihat 8 dan 4 di sini.
Dan saya melakukan perkara yang sama.
Saya menukar lagi.
Dan akhirnya, 2 dan 8.
Saya juga menukar mereka.
>> Ia dipanggil Bubble Disusun kerana selepas setiap lelaran ini, sebenarnya,
bilangan terbesar dalam senarai mendapat semua jalan ke akhir senarai.
Adakah ini masuk akal?
Kerana ia menyimpan bertukar-tukar ia dan bergerak ke kanan.
>> OK, jadi ini adalah lelaran kedua.
Ia akan menjadi perkara yang sama.
Saya akan melakukan satu swap dan kemudian yang terakhir.
Saya tiada swap dan senarai ini disusun.
Jadi dalam gelembung Susun, kita pada dasarnya menyimpan akan senarai dan bertukar-tukar
perkara sehingga saya melihat bahawa saya tidak melakukan apa-apa pertukaran melakukan lelaran itu, yang
bermakna senarai sudah disusun.
Masuk akal?
>> Mari kita bercakap sedikit kira-kira berjalan masa.
Jadi yang anda semua ingat Besar O, Omega, dan Teta?
Yeah?
OK, apa yang Big O, pertama sekali?
>> PENONTON: [didengar].
>> LUCAS: Ya, ia dipanggil kes terburuk runtime, yang hanya bermaksud bahawa itu
berapa banyak yang anda mengharapkan program ini untuk mengambil berjalan.
Seperti, dari segi -
dalam kes ini - n.
Bilangan elemen dalam senaraikan dalam kes yang paling teruk.
Seperti, dalam kes paling teruk mungkin.
>> Jadi untuk Bubble Susun, sebagai contoh, kita mempunyai Big O n persegi.
Mengapa kita mempunyai itu?
Mengapa Bubble Disusun Big O n persegi?
>> PENONTON: [didengar].
>> LUCAS: Ya, jadi kes terburuk akan yang saya perlu lakukan n lelaran.
Jadi setiap satu daripada lelaran akan membawa unsur terbesar ke akhir
senarai.
Jadi kes terburuk adalah bahawa saya mempunyai untuk berbuat demikian perkara n kali.
Dan bagi 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, bagi setiap lelaran, saya perlu
melihat setiap unsur 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 terburuk akan
berkenaan, yang satu, saya perlu memasukkan nombor n, bukan?
Jadi saya sudah tahu bahawa saya akan mempunyai n lelaran.
Tetapi bagi setiap orang-orang nombor, jika saya mempunyai untuk melihat semua nombor dalam
senarai disusun dan meletakkan semuanya cara di hadapan, yang akan n persegi
kerana ia akan kali n lagi n.
Masuk akal?
Apa kira-kira omega?
>> PENONTON: [didengar].
>> LUCAS: Ia senario kes terbaik.
Jadi rasanya, dalam banyak kali untuk menyusun, senario kes terbaik adalah
apabila senarai itu sudah disusun.
Jadi anda tidak benar-benar mempunyai untuk melakukan apa-apa.
Bubble Disusun telah 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 bersedia 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 yang bersebelahan.
Saya akan melihat bahawa tidak ada swap.
Dan saya hanya kembali segera.
>> Jadi ia bermakna bahawa saya hanya terpaksa pergi melalui senarai satu masa.
Jadi ia n kerana saya melihat pada n elemen.
Mengapa pemilihan jenis n persegi?
>> Ya, walaupun senarai itu disusun, untuk setiap lelaran daripada jenis pilihan, saya
perlu memilih elemen yang minimum.
Jadi ini bermakna bahawa saya telah keluar untuk melihat di semua elemen dalam Unsorted
menyenaraikan dan mencari minimum bagi setiap lelaran.
Adakah ini masuk akal?
>> Dan pedang kemasukan adalah n kerana dalam kes yang 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 Unsorted.
Jadi itulah sebabnya ia akan menjadi n.
Masuk akal?
Dan apa yang theta?
>> PENONTON: [didengar].
>> LUCAS: Apa, maaf?
Katakan sekali lagi.
>> PENONTON: [didengar].
>> LUCAS: Tepat sekali.
Jadi anda boleh melihat bahawa hanya pilihan disimpan di dalam 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 adalah jenis seperti cara yang sama yang
anda melakukan carian binari.
Jadi anda mendapat senarai.
Dan anda akan dipotong dua.
Dan kemudian anda memotong mereka dalam bahagian yang lebih kecil.
Dan kemudian anda menggabungkan mereka.
Anda semua masih ingat bahawa, bukan?
OK, kerana beliau berkata.
>> OK, petunjuk.
Jadi apa penunjuk?
>> PENONTON: [didengar].
>> LUCAS: Alamat.
OK.
Saya tahu bahawa David menunjukkan sekumpulan video Binky dan perkara-perkara menunjuk
antara satu sama lain.
Tetapi saya suka untuk memikirkan petunjuk sebagai semata-mata alamat.
Jadi ia adalah satu pembolehubah yang akan untuk menyimpan alamat.
>> Jadi ia hanya ubah istimewa ini iaitu empat bait.
Ingat, bahawa penunjuk kepada apa-apa adalah sentiasa empat bait panjang untuk 32-bit kami
mesin supaya kes dengan perkakas.
Dan ia hanya mempunyai lokasi yang daripada dalam pembolehubah itu.
>> OK, jadi ada memori ini, pada asasnya.
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 ini.
Jadi sebab mengapa kita akan menggunakan petunjuk adalah jika saya perlu ingat lokasi
yang berubah-ubah tertentu adalah ingatan.
>> Dan anda semua masih ingat bahawa salah seorang daripada mereka kes adalah jika saya mempunyai fungsi yang
jika saya benar-benar telah mahu anda swap untuk sahih, saya sebenarnya
perlu menghantar penunjuk.
Tidak berubah-ubah itu.
Adakah anda semua ingat bahawa?
Perbezaan antara -
apa yang nama?
Memanggil dengan nilai dan memanggil dengan merujuk, bukan?
>> OK, yeah.
Jadi panggilan oleh nilai.
Apabila anda hanya menghantar ubah untuk berfungsi anda hanya menghantar nilai.
Jadi anda sebenarnya menghantar salinan pembolehubah.
Dan program anda tidak kisah mengenai 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 ubah itu.
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
untuk 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 berubah-ubah menaip yang anda telah.
>> Jadi di bintang, sebagai contoh, ia penunjuk dan integer.
Dan kemudian bintang char adalah penunjuk bintang char dan sebagainya.
Yeah?
>> PENONTON: Bagaimana jika kita mempunyai penunjuk kepada n kepada bintang 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 sedang mencipta 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 adalah
akan menjadi penunjuk.
Dan sesuatu yang menarik tentang petunjuk ialah kita mengatakan bahawa mereka mempunyai
4 bait 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 anda semua harus ingat.
Yang pertama adalah Ampersand.
Yang kedua adalah bintang.
Jangan keliru dengan yang bintang dan ini bintang kerana ingat bahawa, pada
kes ini, anda perlu n bintang.
>> Ia seperti satu perkara yang keseluruhan bersama-sama.
Tidak ada ruang n bintang.
Jadi ia bermakna bahawa ia jenis.
Ingat, bahawa apabila anda mempunyai bintang berubah-ubah, anda
bercakap tentang jenis.
>> Apabila anda baru sahaja bintang dan maka Nama pembolehubah, ia bermakna bahawa
anda penyahrujukan penunjuk, yang bermakna bahawa 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 penunjuk bintang, ia adalah
kandungan penunjuk.
Jadi anda pergi ke apa sahaja ia menunjuk ke dan melihat kandungan yang berterusan.
Dan Ampersand adalah sama perkara seperti alamat.
>> Jadi, jika saya mempunyai pembolehubah - seperti, mari kita mengatakan bahawa saya int yang bersamaan 3 -
jika saya ingin mencari alamat yang ubah ingatan, saya hanya boleh melakukan
Ampersand a.
Jadi ia alamat a.
Masuk akal?
>> Jadi inilah contoh.
Ini hilang b dan int int c.
Jadi int yang bersamaan 3 cara yang Saya akan pergi ke ingatan.
Dan saya akan untuk mencari slot yang dan meletakkan nombor 3 di sini.
>> Dan kemudian int b sama 4.
Saya akan melakukan perkara yang sama.
Pergi ke memori dan meletakkan nombor 4 dalam salah satu kotak.
Dan int sama dengan 5.
Cari kotak yang lain dan meletakkan nombor 5.
>> Jadi apa yang melakukan baris ini keluar? n bintang setahun sama Ampersand a.
Jadi pertama sekali, n bintang setahun.
Apa yang ia lakukan?
>> PENONTON: [didengar].
>> LUCAS: Ya, jadi n bintang setahun, pertama, mengisytiharkan penunjuk yang dipanggil setahun.
Dan kemudian ia memberikan nilai bahawa penunjuk sebagai alamat a.
Jadi Ampersand a.
Kemudian, jika saya lakukan pb bintang, apa yang pb bintang?
>> Oh, maaf.
Ini juga hilang. n pb bintang.
Saya maksudkan 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 sebenarnya akan melihat alamat yang.
OK?
Yeah?
>> PENONTON: [didengar]?
>> LUCAS: Ya, penunjuk alamat.
Jangan sekali-kali lupa bahawa.
Ia seperti yang paling penting sebahagian kira-kira petunjuk.
Ada menyimpan dan alamat kepada beberapa pembolehubah.
Apa-apa lagi?
Apa-apa soalan lain?
OK.
>> Jadi Penunjuk dan Perlengkapan.
Ingat bahawa apabila saya melakukan int array 3, pada asasnya, apa yang saya lakukan adalah saya, jenis
daripada, mengisytiharkan dalam penunjuk.
Jadi pelbagai jenis seperti satu penuding kepada satu tempat tertentu dalam ingatan di mana saya
diperuntukkan tiga slot untuk integer.
Adakah ini masuk akal?
>> Oleh itu, apabila saya int array 3, apa yang saya lakukan, pada dasarnya, ialah 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 tatasusunan,
yang bermakna saya memadam pointer, saya pergi ke tempat itu bahawa ia menunjuk ke,
dan saya meletakkan nombor satu.
>> Dan kemudian, jika saya melakukan pelbagai bintang tambahan 1, itu perkara yang sama seperti melakukan pelbagai
kurungan satu, yang hanya bermakna saya pergi ke tempat yang ia menghala ke arah.
Dan kemudian dicampurkan dengan 1 membuat saya beralih satu kedudukan.
Jadi saya pergi ke kedudukan ini, sebenarnya, dan meletakkan nombor dua.
>> Dan kemudian, akhirnya, apabila saya melakukan pelbagai campur 2, saya pergi ke mana
menunjuk pelbagai di.
Dan kemudian saya berpindah ke blok ingatan.
Dan kemudian saya meletakkan nombor tiga di sini.
Yeah?
>> PENONTON: pelbagai Jadi bintang hanya berkata titik yang pertama.
Dan anda boleh tambah 1, hanya kerana kami hanya benar-benar
rujukan alamat pertama.
>> LUCAS: Yeah.
Mengapa kita, sebagai contoh, berkata pelbagai 0, array 1, dan array 2?
Yang saya katakan, mengapa yang anda lakukan 0, 1, 2, 3 bukan 1, 2, 3?
Salah satu sebab ialah, satu, komputer pengaturcara 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 bermakna saya pergi ke kedudukan itu, dan saya tidak
skip mana-mana blok ingatan.
Jadi, saya tidak bergerak mana-mana blok ingatan.
Yeah?
>> PENONTON: [didengar]?
>> LUCAS: Jadi dia meminta 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 sebenarnya berfungsi?
Jadi mengapa kita juga perlu menggunakan malloc?
Jenis compiler anda angka semua pemboleh ubah diisytiharkan.
Dan dia mencipta ruang untuk semua daripada mereka dalam tindanan.
Jadi semua pembolehubah anda akan di suatu tempat di timbunan.
Jadi di sini adalah pembolehubah persekitaran.
>> Jadi, pada asasnya, ruang untuk pembolehubah-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 tahu bagaimana memori banyak yang anda perlukan.
>> Tetapi sekarang mari kita mengatakan bahawa, sebagai contoh, anda mencipta array atau mengambil
tali bahawa 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?
>> Jadi ia tidak benar-benar masuk akal untuk anda untuk mengatakan meletakkan 100 aksara.
Dan kemudian bagaimana 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 jalanan.
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 memori memperuntukkan di
runtime, yang bererti bahawa anda memutuskan pada ketika itu bahawa anda
harus mempunyai memori yang.
Jadi, itu apabila anda memperuntukkan ia.
Adakah ini masuk akal?
>> Jadi ingat, tindanan mempunyai pembolehubah yang dicipta pada masa kompil.
Dan kemudian timbunan itu mempunyai pembolehubah yang dicipta anda pergi
dengan malloc, sebagai contoh.
>> PENONTON: [didengar]?
>> LUCAS: Jadi GetString adalah akan memanggil malloc.
Izinkan saya bercakap tentang malloc, dan Saya akan menjelaskan GetString.
Jadi malloc adalah perkara yang sama sebagai peruntukan ingatan.
Jadi ia akan memperuntukkan memori pada timbunan itu.
Dan ia akan kembali penunjuk kepada di mana memori yang telah diperuntukkan di.
>> Oleh itu, apabila anda lakukan -
di sini sebagai contoh -
n penunjuk bintang.
Dan kemudian penunjuk sama malloc saiz kali inci 10.
Saya mewujudkan penunjuk.
Dan kemudian saya memberikan penunjuk bahawa untuk nilai penunjuk yang malloc
adalah memberi saya.
>> Jadi saya meminta malloc anda boleh memperuntukkan ruang untuk 10 integer.
Itulah 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 yang anda dapat dari malloc adalah
null atau tidak kerana, jika ia adalah, anda mungkin akan penyahrujukan penunjuk dan
menyebabkan kerosakan sampingan.
Dan akhirnya, jangan lupa memori anda.
>> Malloc mewujudkan memori dalam timbunan itu.
Dan anda perlu untuk membebaskan memori sebelum program berakhir.
OK, itu sahaja untuk saya.
Maaf, Rob.
Terima kasih.
>> [Tepuk tangan]
>> LUCAS: Mana-mana soalan terakhir sebelum Rob datang?
Tidak?
Yeah?
>> PENONTON: Saya tidak melihat satu ini dalam 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 anda mempunyai malloc budaya, anda perlu mempunyai budaya yang percuma
selepas anda berhenti menggunakan pembolehubah yang.
Jadi malloc dan bebas adalah sentiasa bersama-sama.
Rakan-rakan mereka yang terbaik.
Yeah.
Rob?
>> ROB: Saya akan pergi dengan cepat.
Dan juga video akan meletakkan.
Saya mempunyai mikrofon pada.
>> OK, jadi minggu lima barangan.
Perkara pertama yang kami ada ialah timbunan.
Jadi ingat bahawa hanya terdapat satu timbunan bingkai setiap panggilan fungsi aktif.
Kita akan melihat bahawa dalam satu saat.
Dan juga ingat apa yang sebenarnya pergi dalam setiap bingkai tindanan akan menjadi
pembolehubah tempatan fungsi kami, hujah-hujah yang diluluskan ke dalam kami
fungsi, bersama-sama dengan pasangan perkara 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 ubah n sama dengan 4 kali 6.
Dan kemudian kembali n.
>> Jadi mari kita lihat timbunan sepanjang lelaran sebenar program ini.
Jadi ada bahagian bawah timbunan kami.
Ingat bahawa tindanan membesar.
Jadi di bahagian bawah timbunan kami, kami mempunyai bingkai tindanan untuk utama.
Apabila program bermula, utama sentiasa akan berada di
bawah timbunan kami.
>> Dan apa yang di dalam kita stack frame untuk utama?
Jadi, walaupun tidak ada tempatan pembolehubah untuk utama, seperti yang saya katakan sebelum ini,
kita mempunyai argc dan RGV mengambil ruang di dalam bingkai tindanan utama.
Jadi utama kini akan memanggil fungsi foo itu.
Dan itu bererti foo akan dapatkan rangka timbunan sendiri.
>> Jadi sekarang kita dalam yang foo fungsi.
Dan apa yang perlu pergi dalam bingkai tindanan foo ini?
Nah, foo mempunyai hujah n.
Dan n adalah sama dengan 4 kerana itulah yang utama berlalu sebagai hujah foo ini.
>> Jadi sekarang foo akan memanggil bar.
Apa yang bar akan mempunyai di dalam bingkai tindanan yang '?
Ia mempunyai x sama dengan 4 y sama dengan enam.
Bukan itu sahaja 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 rangka foo timbunan.
Dan kerana bar kini kembali semula, yang bermakna kita popping bingkai tindanan
untuk bar kira tindanan.
Jadi semua memori bar yang 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 kini, utama akan memanggil printf.
Jadi printf hanya fungsi 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, kita lulus peratus yang i garis sendeng terbalik n dan
hujah 24.
Ia mungkin mempunyai lebih banyak ia stack frame jika printf kebetulan menggunakan beberapa
pembolehubah tempatan.
Kita tidak tahu.
>> Tetapi semua 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.
Dan kemudian program kami dilakukan.
Yeah?
>> PENONTON: Adakah anda melihat [didengar]
hujah [didengar]
parameter?
>> ROB: Jadi terdapat perbezaan halus antara hujah-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 untuk 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 masuk
Dan n parameter, 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 satu parameter untuk foo.
Ia bukan satu pembolehubah tempatan.
Yeah?
>> PENONTON: [didengar]?
>> ROB: foo hanya memanggil bar dan kembali apa sahaja bar pulangan.
>> PENONTON: [didengar]?
>> ROB: Ya, hanya untuk melihat pelbagai stack frame.
Yeah?
>> PENONTON: Mengapa foo dipanggil sebelum printf?
>> ROB: Mengapa foo dipanggil sebelum printf?
Jadi saya boleh, sebaliknya, melakukan sesuatu yang seperti int x sama foo 4
dan kemudian x dicetak.
Tetapi sebaliknya, saya digabungkan fungsi panggilan ke hujah printf itu.
>> Tetapi notis bahawa kita tidak boleh sebenarnya melaksanakan panggilan untuk printf sehingga kita
memikirkan apa foo 4 adalah.
Jadi, kita akan menilai ini.
Dan hanya sekali itu dilakukan akan untuk kembali dan menilai ini.
Yeah?
>> PENONTON: Oleh kerana kedua-dua bar [didengar]
nilai, mengapa kita tidak mempunyai [didengar]?
>> ROB: Mereka sama sekali harus int.
Yang tidak ditangkap lebih pelbagai pas.
Jadi ia harus bar int dan int foo sejak kedua-dua mereka
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 atas pulangan?
>> PENONTON: Yeah.
Seperti jika anda tidak printf dan [didengar], ia akan mencetak dua kali?
>> ROB: Jadi dalam foo?
Jika kita mempunyai printf yang betul di sini?
>> PENONTON: Yeah.
>> ROB: Jadi, jika kita mempunyai hak printf di sini, ia akan mencetak sekali.
Oleh kerana kita menyeru foo sekali betul sini, maka kita akan melanda 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 kita pertama memanggil printf dan kemudian kita lulus
hujah-hujah.
>> ROB: Jadi dalam teori, tidak printf memanggil foo?
Jadi tidak.
Hanya perintah itu yang c akan melaksanakan perkara-perkara ini adalah, sebelum kita boleh
memanggil fungsi, semua hujah-hujah ke fungsi yang perlu
dinilai sepenuhnya.
Jadi hal ini dinilai sepenuhnya?
Ya, ia hanya rentetan.
Ia hanya satu nilai.
>> Maka kita perlu benar-benar menilai ini.
Setelah ini dilakukan, kini semua hujah-hujah 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 dengan koma bertitik pulangan jika anda mempunyai fungsi tidak sah.
OK.
Jadi sekarang beberapa barangan timbunan.
Jadi timbunan adalah bagaimana kita akan berurusan dengan pengurusan ingatan dinamik.
Dan ini berbeza langsung dengan stack yang mana kita panggil automatik
pengurusan ingatan.
>> Jadi pada timbunan, anda tidak benar-benar mempunyai untuk menangani bagaimana pemboleh ubah tempatan
terpaksa masuk dan muncul kira semua ini bingkai tindanan dan semua barangan itu.
Anda tidak perlu bimbang mengenainya.
Ia automatik.
Jadi timbunan itu manual.
Dan [didengar]
datang dari fungsi-fungsi malloc dan percuma.
>> Jadi inilah program lain.
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 yang x menunjuk ke 50.
Mencetak apa x menuding kepada, x cetak, dan kemudian bebas x.
>> Jadi bagaimana ini sebenarnya akan kelihatan jika kita melihat timbunan dan longgokan kita?
Oleh itu, kita akan mulakan sekali lagi.
Bahagian bawah timbunan kami seperti sebelum ini.
Ingat bahawa engkau ditimbunkannya 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 pembolehubah x tempatan, yang
adalah bintang int.
Jadi kita akan melelar melalui program ini.
Perkara pertama yang kami ada ialah panggilan kepada malloc.
>> Jadi, kita membuat panggilan kepada malloc.
Malloc adalah fungsi.
Ia akan untuk mendapatkan bingkai tindanan.
Apa yang kita berpindah kepada malloc?
Itu akan masuk ke dalam bingkai tindanan.
Kami lulus saiz n, yang 4.
Jadi yang 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 memberikan yang alamat sewenang-wenangnya.
0x123 Hanya berpura-pura bahawa adalah menangani yang ada di timbunan itu.
>> Jadi apa yang sebenarnya di dalam yang rantau memori di alamat Ox123?
Sampah.
Oleh itu, kita telah tidak disimpan apa-apa di dalamnya.
Jadi sebagaimana yang kita tahu, ia dapat apa-apa.
Anda tidak harus menganggap ia sifar.
Ia kemungkinan besar tidak sifar.
>> Pulangan Jadi sekarang malloc.
Dan apa yang kita lakukan apabila pulangan malloc?
Kami menetapkan apa yang ia kembali.
Kami menetapkan x sama dengan apa ia kembali.
Jadi apa yang ia kembali?
Ia kembali 0x123 kerana itu adalah yang alamat blok ingatan yang ia
hanya diperuntukkan dalam timbunan itu.
>> Jadi kembali 0x123 x kini akan ditetapkan sama dengan 0x123 yang, bergambar,
kita sering menarik sebagai x mempunyai sebenar arrow menunjuk ke blok itu.
Tetapi x hanya menyimpan alamat itu.
Jadi sekarang kita perlu menyemak jika x adalah batal.
Ia bukan null.
Kami berpura-pura bahawa malloc yang berjaya.
>> Jadi sekarang bintang x sama 50.
Jadi bintang mengingatinya bermakna pergi ke alamat itu.
Jadi 0x123 Kami akan pergi ke alamat itu.
Jadi yang membawa kita 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 dalam yang alamat tertentu kerana
kami menetapkannya dengan 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 cara 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 maka kita mempunyai printf kedua.
Kami kini peratus p.
Jika anda tidak pernah 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 ialah 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.
Cetak f kedua akan untuk mencetak 0x123 Yeah?
>> PENONTON: Adakah anda menggunakan peratus x untuk mencetak penunjuk?
>> ROB: Jadi anda menggunakan peratus x untuk mencetak penunjuk?
Jadi anda boleh tetapi peratus x adil, secara amnya, untuk seperti jika anda mempunyai beberapa
integer dan anda mahu untuk mencetak sebagai perenambelasan a.
Itu hanya cara melakukannya.
>> Manakala, peratus d akan mencetak sebagai perpuluhan.
Itu Adakah kita mendapatkan peratus d. i hanya integer.
peratus p adalah khusus untuk petunjuk.
>> Jadi x ialah penunjuk.
Kami mahu menggunakan peratus p.
Tetapi peratus x boleh bekerja.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Yeah.
Sekurang-kurangnya untuk panggilan ini - jadi saya tidak termasuk dalam sini.
Tetapi kedua-dua hujah-hujah yang semestinya di dalam bingkai tindanan ini
bersama-sama dengan apa-apa pembolehubah tempatan printf kebetulan menggunakan.
Dan kemudian panggilan seterusnya untuk printf kini dalam printf bingkai tindanan adalah
peratus p garis sendeng terbalik 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 ia mencetak dalam bentuk alamat.
Ia kelihatan seperti alamat.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Kenapa apa?
>> PENONTON: [didengar]?
>> ROB: Mengapa penunjuk 4 bait?
Jadi, terdapat sejumlah 0 di hadapan ini.
Jadi ia benar-benar 0x0000000123.
Pada sistem 64-bit, akan ada sejumlah besar lagi sifar.
Yeah?
>> PENONTON: [didengar].
>> ROB: Jadi printf pertama akan mencetak -
>> PENONTON: [didengar].
>> ROB: Ya, ia akan cetak apa x menunjuk ke.
Bintang berkata apa yang ini perkara menunjuk ke.
Merebutnya.
Jadi apa yang ia menunjuk ke?
50.
Merebutnya.
Itulah apa yang kita akan untuk 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 lulus x.
Itulah kali saya sebenarnya dipaparkan dalam rangka tindanan.
>> Jadi kita lulus nilai 0x123 untuk membebaskan.
Jadi sekarang percuma tahu, semua betul, Saya perlu pergi ke timbunan itu
dan bebas memori itu.
Ia tidak lagi menggunakan apa adalah di alamat 0x123.
>> Jadi percuma akan melepaskan bahawa dari timbunan itu.
Sekarang timbunan kita kosong lagi.
Kami tidak mempunyai sebarang kebocoran memori.
Kini bebas akan kembali.
Perhatikan bahawa x masih 0x123.
Tetapi yang kini ingatan tidak sah.
Kami kini tidak harus dereference x.
Yeah?
>> PENONTON: Adakah kembali 0 berlebihan?
>> ROB: Adakah returen 0 berlebihan?
Ya.
Kami hanya meletakkan bahawa di sana kerana kita mempunyai satu pulangan untuk udara.
Jadi rasanya, yeah, mari kita termasuk pulangan 0.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Jadi selepas bebas x, apa yang berlaku jika kita cuba untuk dereference penunjuk?
Ada kemungkinan bahawa apa-apa yang berlaku.
Ia mungkin 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 memberikan x kepada sesuatu yang lain.
Jadi, jika di sini kita kata x sama sesuatu malloc lain -
saiz malloc peristiwa -
maka bahawa blok asal memori tidak dibebaskan.
Dan kita telah secara rasmi hilang.
Itulah kebocoran memori.
Kita telah kehilangan semua rujukan dengan blok ingatan.
Jadi tidak ada cara kita pernah boleh membebaskannya.
OK, jadi kemudian kembali 0 cara dilakukan.
>> Baiklah, jadi limpahan timbunan.
Apakah idea yang di sini?
Jadi ingat, longgokan akan turun.
Stack akan 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 stack bingkai 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 sekali 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 benar-benar akan seg bersalah 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 kerosakan segmentasi bermakna ada limpahan timbunan.
Jadi tidak semestinya.
Satu 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 dalam gelung tak terhingga.
Seperti, ini adalah seperti tidak terhingga rekursi gelung dan dengan itu kita mendapat satu lagi
timbunan bingkai setiap kali.
Tetapi hanya dalam tetap infinit satu -
baik, mari kita tidak mencetak f -
melakukan sesuatu.
Apa sahaja.
>> Kami tidak akan mendapat lain bingkai tindanan.
Kami hanya akan menyimpan gelung lebih arahan ini tunggal.
Tindanan tidak berkembang.
Ia adalah hakikat bahawa setiap rekursi panggilan memberikan 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
tidak seg bersalah.
Saya tidak mahu mengelirukan sesuatu.
Ia akan gelung.
Anda akan mendapat timbunan tunggal bingkai untuk printf itu.
>> Kemudian printf akan kembali.
Kemudian anda sebaiknya gelung lagi.
Anda akan mendapat timbunan tunggal bingkai untuk printf itu.
Ia akan kembali.
Bingkai tindanan tunggal.
Jadi anda tidak mendapat ini tidak 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 stack 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?
Kira-kira.
Terdapat beberapa rawak untuk di mana timbunan mula dibina dan
di mana timbunan itu bermula.
Jika anda mempunyai banyak keseluruhan pembolehubah global dan perkara-perkara, anda mungkin
mengambil dari sedikit ruang untuk timbunan anda.
>> Pada sistem 64-bit, anda hampir mempunyai memori tak terhingga.
Terdapat hanya begitu banyak.
Antara 32 bit dan 64 bit, yang perbezaan yang signifikan.
>> Anda akan mendapat banyak lagi stack dan ruang timbunan pada 64-bit
sistem kerana ada hanya lebih menangani bahawa mereka boleh digunakan.
Tetapi pada sistem individu, ia akan secara kasarnya jumlah yang sama timbunan
dan ruang timbunan.
Baiklah.
>> Jadi perkara terakhir adalah kompilasi.
Jadi, anda perlu tahu proses ini.
Terdapat empat langkah yang besar.
Jadi yang pertama perlu mudah untuk diingati.
Pra-pemprosesan.
Ia mempunyai pra awalan di dalamnya.
Jadi ia datang sebelum segala-galanya.
>> Perkara yang perlu diingat ialah hash.
Mentakrifkan Jadi hash dan hash termasuk dalam semua daripada mereka.
Mereka semua 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 operasi salinan, dan dipotong, dan tampal.
>> Jadi hash termasuk standard i0 dot h.
Apakah yang lakukan?
Ia merebut standard i0 dot h memfailkan dan paste ke dalam bahagian atas
mana-mana jua kata hash termasuk standard i0 dot h.
>> Dan mana-mana hash menentukan bahawa kita telah lihat, apa yang yang lakukan?
Yang menyalin nilai yang hash ditakrifkan ditakrifkan sebagai dan menampal yang
di mana-mana anda menggunakan nilai.
Jadi prapemproses hanya tidak benar-benar teks ringkas operasi berasaskan.
Ia tidak apa-apa pintar.
Jadi semua yang lain adalah lebih rumit.
>> Jadi sekarang prapemproses yang dilakukan, kita sebenarnya menyusun.
Jadi apakah menyusun bermakna?
Kami sedang pergi dari c kod kepada kod pemasangan.
Yeah?
>> PENONTON: [didengar]?
>> ROB: Ya, kita terperangkap itu.
Jadi menyusun.
Kami akan dari c untuk pemasangan.
Jadi ini adalah satu perubahan bahasa sebenar.
Menyusun sendiri bermaksud pergi dari bahasa peringkat tinggi untuk
bahasa peringkat yang lebih rendah.
>> Dan c adalah bahasa paras tinggi berbanding pemasangan.
Apakah perhimpunan?
Arahannya yang, cantik banyak, dibuat untuk CPU anda.
Tetapi komputer anda masih tidak tidak faham pemasangan.
Ia hanya memahami yang dan sifar.
Jadi langkah seterusnya adalah memasang, yang membawa kita dari arahan ini yang
CPU anda memahami dan sebenarnya diterjemahkan mereka, untuk
orang-orang yang dan sifar.
>> Jadi C untuk pemasangan kepada perduaan.
Tetapi saya tidak mempunyai laksana yet.
Jadi berfikir perpustakaan cs50 itu.
Kami telah menyediakan anda dengan binari untuk ini perpustakaan cs50, yang mempunyai GetString
dan GetInt dan semua itu.
>> Tetapi perpustakaan cs50 yang -
dalam dan dengan sendirinya - 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
ke dalam laku sebenar.
Salah satu yang anda boleh menaip dot dot slash keluar.
>> Jadi ini adalah seperti fail yang anda menulis, - apa jua program yang anda -
Ceaser dot c.
Tetapi kini ia telah disusun ke binari.
Jadi Ceaser dot o.
Dan ini adalah perpustakaan cs50 kami binari.
Dan mereka yang digabungkan menjadi laku 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 kemudian,
tidak, anda tidak perlu apa-apa untuk menghubungkan kerana anda mempunyai segala-galanya.
>> Yang berkata, printf itu dikaitkan masuk
Jika anda pernah menggunakan printf, itu sesuatu yang perlu dikaitkan dalam
kerana anda tidak menulis itu.
Dan, sebenarnya, printf secara automatik dikaitkan masuk
Anda tahu bagaimana pada baris arahan atau apabila anda menaip membuat, anda melihatnya mempunyai
dash l cs50, yang mempunyai pautan di perpustakaan cs50 yang?
Printf, dan barangan seperti itu, akan ada kaitan secara automatik.
Lain-lain soalan mengenai apa-apa?
>> PENONTON: [didengar]?
>> ROB: Menghubungkan?
Kami mempunyai sejumlah besar fail binari yang berbeza.
Ini adalah contoh yang 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.
Jadi 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 link 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 menghubungkan menukar binari untuk laku?
Jadi, walaupun anda tidak mempunyai lain perpustakaan, tidak akan ia masih menjadi
perlu untuk menterjemahkan yang [didengar]?
>> ROB: Jadi boleh laku 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: Yeah.