>> SPEAKER 1: Hi everyone.
Kita akan memulai.
Saya pikir orang masih akan untuk penyaringan dalam.
Tapi untuk kepentingan waktu, sehingga kita bisa mendapatkan kalian keluar dari sini tepat waktu,
kita akan mulai.
Jadi selamat datang CS50 Quiz 0 ulasan.
Bagi Anda yang belum menyadari Namun, Anda memiliki pertanyaan pada hari Rabu.
Woo-hoo.
>> Jika Anda belum mulai belajar belum atau belum menyadari bahwa ini ada belum,
kuis masa lalu dan semua informasi tentang kuis yang memberikan cs50.net/quizzes.
Ada beberapa hal yang cukup baik di sana, kuis terakhir dari yang terakhir 10
tahun serta informasi tentang kuis ini dan topik
yang akan dibahas.
Jadi mari kita mulai.
>> Jadi kalian mungkin ingat, pertama hari kelas Daud lampu mereka pada.
Jadi pada dasarnya, segala sesuatu yang terjadi di bawah kap komputer adalah
dilakukan dalam biner.
Biner berarti apa yang terdengar seperti, 0 dan 1.
Ini memiliki dua nilai yang dapat diwakili.
>> Jadi sama seperti di hari pertama bagian ketika David menyalakan lampu
bohlam untuk mewakili pada, atau 1, komputer kita memahami biner sebagai 0 dan
1 ini, hidup atau mati.
Dasar-dasar dari Binary.
Setiap tempat diwakili dalam basis dua.
Jadi Anda tambahkan 2 ke 0 ke 1 ke 2 sepanjang jalan.
>> Untuk menghitung apa biner Anda adalah untuk desimal, Anda hanya mengikuti persamaan ini
Jenis hal.
Jika Anda memiliki 1 di setiap tempat-tempat, Anda kalikan dengan apapun
dasar itu di, tambahkan itu, dan Anda mendapatkan desimal.
Jadi ini adalah bagaimana Anda menghitung sampai 5 dalam biner.
Sama seperti apa yang kami lakukan di slide terakhir, ini adalah bagaimana Anda akan
mewakili 1 sampai 5.
>> Demikian pula, sama seperti Anda dapat menambahkan dan kurangi dalam desimal atau basis 10, atau
benar-benar dasar apapun, pada dapat menambahkan dan kurangi dalam biner.
Persis apa yang Anda harapkan ketika Anda tambahkan dua, jika itu sama besar
dari 1, Anda membawa 1, membuatnya menjadi 0, dan melakukan penambahan seperti itu, hanya
seperti yang Anda harapkan dengan teratur desimal atau dasar lainnya.
Keren.
>> Jadi seperti saya katakan sebelumnya, segala sesuatu yang terjadi di bawah kap komputer kita
dilakukan dalam 0 dan 1, atau biner.
Jadi bagaimana kita mengekspresikan, misalnya, huruf, atau angka, atau karakter?
Dan jawabannya adalah ASCII.
>> ASCII merupakan pemetaan antara karakter bahwa kita biasanya akan melihat di
Bahasa Inggris seperti A, B, C, garis bawah, tanda hubung, dan
sesuatu seperti itu.
Dan itu peta bahwa untuk nilai ASCII.
Nilai ASCII adalah hanya nomor yang dapat dipahami oleh komputer Anda.
Dan seperti Anda dapat melakukan penambahan dan pengurangan dengan angka, Anda dapat melakukan
mereka dengan nilai-nilai ASCII.
>> Jadi, dalam contoh ini, apa akan mencetak ini?
Ya, jadi hanya Sebuah ruang B ruang angkasa C D. mana mouse saya pergi?
Perhatikan Anda dapat menentukan int pada 65.
Dan ketika Anda mencetak yang menggunakan persen C, itu akan menafsirkan bahwa sebagai
karakter dan akan mencetak A.
>> Demikian pula, Anda dapat mendeklarasikan sebagai char.
Dan ketika Anda mencetaknya menggunakan persen C, itu akan menafsirkan bahwa sebagai
persen D. Dan seperti Anda dapat menambahkan nomor, Anda dapat menambahkan karakter
Nilai ASCII, dalam hal ini.
>> Jadi pointer kecil untuk semua orang.
5, sebagai string, tidak sebenarnya sama 5.
Jadi bagaimana mungkin kita mengubah String 5 ke integer 5?
Ada gagasan?
Ya.
>> Jadi jika kita memiliki 5 sebagai string, kita dapat mengurangi 0.
Dan itu akan memberi kita 5.
Dan sama, jika kita memiliki 5 sebagai integer, menambahkan bahwa ke string 0.
Dan yang memberi kita string 5.
Keren.
>> Sekarang, ingat kembali untuk kuliah di mana kita berbicara tentang algoritma.
Jadi bagaimana kita benar-benar ingin komputer untuk melakukan hal-hal yang menarik?
Kau tahu, hanya menambahkan dan mengurangkan angka dan mencetak hal-hal yang tidak
yang menarik.
Biasanya, kita ingin komputer kita ke melakukan beberapa jenis algoritma.
Sesuatu yang sedikit lebih kompleks dari sekedar aritmatika sederhana.
>> Algoritma ini hanya langkah demi langkah set instruksi untuk bagaimana melakukan
a task-- tertentu
persis seperti resep.
Anda mungkin ingat hari pertama kelas di mana David telah kita hitung ruang
orang dan berapa banyak orang berada di dalam ruangan.
Anda mungkin digunakan untuk menghitung satu per satu.
1, 2, 3, 4.
Dalam hal ini, algoritma waktu linear.
>> Tapi David memperkenalkan sebuah algoritma untuk Anda menghitung orang-orang di ruang
di mana semua orang berdiri, Anda mengatakan Anda nomor orang lain, menambahkan bahwa
nomor, dan satu orang duduk.
Dan anda ulangi.
Itu salah satu jenis algoritma.
Kita dapat menganalisis sebuah seberapa efisien Algoritma ini didasarkan pada itu run time.
Tapi kita akan berbicara sedikit lebih lanjut tentang itu nanti.
>> Jadi semua algoritma juga dapat ditulis dalam pseudocode.
Pseudocode hanya sebuah bahasa Inggris seperti sintaks yang digunakan untuk mewakili
bahasa pemrograman.
Sebagai contoh, jika kita ingin meminta pengguna menebak nomor favorit saya, kami
mungkin memiliki pseudocode seperti itu.
>> Dapatkan pengguna menebak.
Jika menebak benar, memberitahu mereka mereka benar, yang lain memberitahu mereka
mereka tidak benar.
Dan pseudocode adalah cara mudah mewakili ide atau algoritma.
Jadi sekarang kita mungkin ingin untuk benar-benar menulis dalam bahasa yang komputer ini
mungkin pemahaman.
Jadi kita bisa menulis pseudocode dan menafsirkan bahwa ke kode sumber.
>> Sejauh ini, kode sumber harus mematuhi dengan sintaks tertentu
bahasa pemrograman.
Dan sejauh ini, dalam CS50, kami telah telah menggunakan sebagian besar c.
Jadi ini mungkin source code untuk c.
Kemudian dalam kursus, Anda malam datang ke dalam kontak dengan pemrograman lain
bahasa seperti PHP.
Atau jika Anda bahkan mengambil kelas-kelas lain, Anda mungkin melakukan Java, Python, atau bahkan OCML.
Tapi dalam kami program bahasa c, ini adalah bagaimana kita bisa menulis kode sumber untuk
algoritma pseudocode yang Aku hanya dijelaskan sebelumnya.
>> Jadi bagaimana komputer Anda benar-benar mengerti?
Seperti saya katakan sebelumnya, itu hanya benar-benar memahami angka satu dan nol.
Jadi bagaimana cara mendapatkan dari sumber kode untuk sesuatu yang dapat
dipahami?
Yah, kita memiliki sesuatu disebut kompilator.
>> Jika Anda ingat kembali sebagian dari Anda psets, Anda memiliki beberapa jenis program
ditulis dalam sebuah file dot c.
Dan kemudian Anda akan ketik make.
Jadi apa yang membuat lakukan?
>> Anda dapat mengetik make untuk mengkompilasi Anda Program karena someone--
siapa pun yang menulis p setel; mungkin David--
membuat file make.
Dan yang memberitahu membuat tahu untuk menjalankan compiler, yang disebut dentang, kehendak yang
kemudian kompilasi kode sumber untuk objek kode, yang merupakan nol dan satu
bahwa komputer Anda mengerti.
Tapi sedikit nanti, kita akan pergi lebih mendalam tentang compiler.
>> Jadi ingat PSET 0, where-- ya, Anda memiliki pertanyaan?
>> AUDIENCE: [Tak terdengar]?
>> SPEAKER 1: Ya.
Saya pikir mereka benar-benar harus online.
Ya.
>> AUDIENCE: Apakah seperti [Tak terdengar]?
>> SPEAKER 1: Hal ini tidak.
Berada pada cs50.net/quizzes.
>> AUDIENCE: kuis Slash, slash 2013, slash 0, dan klik melalui
kuis 2013 dan kuis 0, meninjau bagian slide.
>> SPEAKER 1: Ya, jadi jika kalian ingin tarik ke atas dan melihat pada Anda
komputer sendiri, itu bagus juga.
Katakanlah itu lagi.
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Ya, [Tak terdengar] adalah variabel dummy.
Oh, ya?
>> AUDIENCE: [Tak terdengar]?
>> SPEAKER 1: Tidak, pemogokan tidak pada ujian.
Maaf, pertanyaannya adalah, adalah pemogokan pada ujian.
Dan itu tidak.
Jadi PSET 0, kalian harus memiliki semua diimplementasikan sesuatu menggunakan awal.
Dan kita belajar beberapa pemrograman dasar blok bangunan menggunakan awal.
>> Jadi mari kita lihat beberapa blok bangunan ini
yang membentuk program.
Pertama adalah ekspresi Boolean.
Ekspresi Boolean adalah orang-orang dan 0 atau apa pun yang memiliki
dua nilai yang mungkin.
Dalam hal ini, benar atau salah, on atau off, dan ya atau tidak.
Contoh sederhana, sangat sederhana, program yang menggunakan Boolean yang
ekspresi di sini.
>> Jadi agar ekspresi Boolean untuk berguna, kita memiliki operator Boolean.
Ini adalah operator yang dapat digunakan untuk membandingkan nilai-nilai tertentu.
Jadi kita memiliki dan atau tidak sama dengan, kurang dari atau sama dengan, lebih besar dari atau
sama dengan, dan kurang dari atau lebih besar dari.
Tapi operator ini tidak terlalu berguna kecuali kita dapat menggabungkan mereka ke dalam
kondisi.
>> Jadi kalian mungkin ingat dari awal dan dari p Anda menetapkan bahwa kita
memiliki kondisi.
Mereka adalah, pada dasarnya, seperti garpu di logika program anda yang
mengeksekusi tergantung pada apakah kondisi terpenuhi.
Jadi salah satu kondisi yang kita miliki digunakan berkali-kali dalam kursus ini adalah
if, else, jika, dan kondisi lain.
>> Berikut ini adalah contoh bagaimana Anda mungkin menggunakannya.
Apakah ada yang tahu perbedaan antara hanya menggunakan jika pernyataan semua
cara menurunkan ayat-if, else, jika, dan lain digabungkan?
Ya?
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Tepat.
Jadi jika saya punya jika semua jalan ke bawah ini cara, bahkan jika kondisi ini kembali
benar, masih akan terus pengujian dua berikutnya.
Bahwa, dengan-jika lain, seorang yang lain pernyataan, jika mengembalikan nilai true,
yang lain tidak diuji.
Ada pertanyaan tentang hal itu?
Keren.
>> Jadi Anda menggunakan lain jika-suatu yang lain Pernyataan jika Anda tahu bahwa itu hanya dapat
menjadi salah satu kasus ini.
Jadi kita tahu jika x kurang dari 0, itu pasti tidak akan
lebih besar dari 0.
>> Selanjutnya, blok bangunan lain yang kita pelajari adalah loop.
Kami memiliki tiga jenis loop.
Untuk loop, sementara loop, dan dilakukan sementara loop.
Dan umumnya, ketika Anda duduk untuk menulis sesuatu, Anda harus memutuskan
yang mana dari tiga yang ingin Anda gunakan.
Jadi bagaimana kita memutuskan yang mana?
>> Kami umumnya menggunakan untuk loop jika kita tahu berapa kali kita ingin iterate
melalui sesuatu atau berapa kali kami ingin melakukan tugas.
Kami menggunakan sementara loop jika kita perlu beberapa Kondisi benar untuk tetap berjalan.
Dan kita menggunakan lakukan sementara sangat mirip dengan sementara, tapi kami ingin kode kami untuk berjalan pada
setidaknya satu kali.
>> Begitu juga saat, apa yang ada di do akan selalu berjalan setidaknya satu kali.
Bahwa, dengan sementara, itu mungkin tidak berjalan sama sekali jika
Kondisi tidak puas.
Ada pertanyaan dengan itu?
>> Jadi struktur untuk loop.
Kalian semua telah melihat ini.
Anda menginisialisasi itu.
Anda memiliki semacam kondisi.
Jadi, misalnya, kita mungkin menginisialisasi Adapun i sama dengan 0.
i kurang dari 10.
Dan i ++.
Sangat sederhana yang telah kami lakukan.
>> Untuk beberapa saat loop, sama, Anda harus untuk memiliki semacam inisialisasi,
semacam kondisi, dan semacam pembaruan.
Jadi kita bisa menerapkan kita untuk loop juga sebagai loop saat menggunakan ini.
Dan sama dengan do while, kita mungkin memiliki beberapa inisialisasi,
mengeksekusi sesuatu, update, dan kemudian memeriksa kondisi tersebut.
>> Jadi sekarang fungsi.
Kami meletakkan segala sesuatu bersama-sama.
Kita mungkin ingin menulis beberapa jenis fungsi.
Fungsi umum bahwa Anda mungkin telah melihat sudah ada utama.
Utama adalah fungsi.
Memiliki jenis kembali, int.
Memiliki nama fungsi, utama.
Dan memiliki argumen, argc dan argv.
Jadi utama hanya fungsi.
>> Fungsi lain yang mungkin telah digunakan, printf printf-- adalah function-- sebuah
GetInt, toupper.
Tapi ini terjadi telah diimplementasikan untuk kita oleh
semacam perpustakaan.
Jika kalian ingat termasuk perpustakaan CS50.h ini atau
standar I / O perpustakaan.
Ya, pertanyaan?
>> AUDIENCE: Apakah utama hanya melekat dalam c?
Apakah itu hanya semacam [Tak terdengar]?
>> SPEAKER 1: Pertanyaannya adalah jika utama adalah melekat dalam c.
Dan ya, semua fungsi memiliki fungsi utama.
Ini semacam diperlukan untuk komputer untuk mengetahui di mana untuk memulai
menjalankan kode.
>> AUDIENCE: Jadi Anda tidak akan [Tak terdengar]?
>> SPEAKER 1: Tidak
Ada pertanyaan lain?
Keren.
Jadi sama seperti Anda dapat menggunakan fungsi yang ditulis untuk Anda, Anda juga dapat
menulis fungsi sendiri.
Ini adalah fungsi bahwa seseorang mungkin telah menulis untuk menghitung volume
dari q, misalnya.
Ada jenis kembali di sini, dalam hal ini int, kami nama fungsi q dan kami
daftar parameter.
>> Dan perhatikan bahwa Anda harus menulis data jenis parameter yang akan
menggunakan atau lain fungsi tidak tahu seperti apa
parameter yang harus saya menerima.
Jadi, dalam hal ini, kami ingin integer sebagai masukan kami.
Jadi mengapa mungkin kita ingin menggunakan fungsi?
>> Pertama-tama, besar untuk organisasi.
Mereka membantu memecah kode Anda ke lebih terorganisir potongan dan membuat
lebih mudah untuk dibaca.
Penyederhanaan.
Ini bagus untuk desain.
Ketika Anda membaca sepotong kode dan fungsi utama benar-benar,
sangat panjang, mungkin lebih sulit untuk Alasan tentang apa yang terjadi.
Jadi jika Anda memecahnya menjadi fungsi, akan lebih mudah untuk dibaca.
Dan menggunakan kembali-kemampuan.
Jika Anda memiliki serangkaian kode yang menjadi dipanggil atau menjalankan beberapa kali,
bukan menulis ulang kode yang 10 kali dalam fungsi utama Anda, Anda mungkin
ingin menggunakannya kembali.
Dan kemudian setiap kali Anda perlu menggunakan potongan kode, memanggil fungsi.
>> Jadi sekarang jika kita ingat kembali ke awal, kami juga berbicara tentang beberapa konsep,
salah satunya adalah threading.
Thread adalah konsep multiple urutan kode
mengeksekusi pada waktu yang sama.
Jadi pikirkan kembali ke hari pertama di mana Daud kalian menghitung dari jumlah
orang di ruangan.
>> Pada dasarnya, apa yang sedang terjadi pada semua dari kalian yang
menjalankan thread terpisah.
Dan topik tersebut datang bersama-sama untuk mendapatkan beberapa jenis jawaban.
Demikian pula, di Scratch, ketika Anda memiliki beberapa sprite, Anda mungkin
memiliki kucing dan anjing.
Dan mereka akan secara simultan menjalankan skrip mereka sendiri.
Itu adalah contoh dari threading.
>> Dan konsep lain yang diperkenalkan pada awal adalah acara.
Dan peristiwa ketika beberapa bagian dari kode Anda berkomunikasi satu sama lain.
Dalam Scratch, ini adalah ketika Anda menggunakan kontrol siaran dan Ketika saya
Menerima blok.
>> Dan juga, pada Soal Set 4, kita melihat sedikit peristiwa juga.
Kalian mungkin telah digunakan perpustakaan Gevent.
Dan ada fungsi waitForClick di mana Anda sedang menunggu
bagi pengguna untuk mengklik.
Dan klik Anda, dalam hal ini, akan acara dan menunggu klik adalah Anda
event handler.
>> Dan juga, seluruh menjalankan psets Anda dan bekerja pada psets Anda, Anda
mungkin telah datang ke dalam kontak dengan beberapa perintah ini.
Ini adalah apa yang Anda ketik ke dalam jendela terminal atau jendela apapun
yang muncul di g mengedit Anda untuk, dasarnya, navigasi komputer Anda.
>> Jadi misalnya, LS daftar isi direktori.
Membuat direktori membuat folder baru.
CD, direktori perubahan.
RM, menghapus, menghapus file atau beberapa direktori.
Dan kemudian menghapus direktori menghapus direktori.
>> AUDIENCE: [Tak terdengar]?
>> SPEAKER 1: Ya, tentu.
Maaf, pertanyaannya adalah jika Anda akan menyarankan menempatkan ini
pada lembar contekan.
Ini bisa membantu.
Jika Anda memiliki ruang, Anda bisa memakainya.
Hal ini juga hanya umumnya cukup baik mengingat karena ketika Anda menggunakannya
Anda mungkin ingin hanya memilikinya hafal.
Itu akan membuat hidup Anda jauh lebih mudah.
Apakah saya menjawab pertanyaan Anda?
>> Jadi sekarang, kami berbicara sedikit singkat tentang perpustakaan.
Tapi dua yang utama yang kita sudah menggunakan sejauh ini dalam kursus ini
standar I / O dan CS50.
Apa hal-hal yang termasuk dalam I standar / O perpustakaan?
>> Ya, sejauh ini kami telah menggunakan printf.
Dalam CS50, kami telah menggunakan getInt dan GetString.
Dan tipe data string yang juga terjadi harus dinyatakan di perpustakaan CS50 ini.
Kami akan berbicara sedikit lebih mendalam tentang bagaimana perpustakaan bekerja dan bagaimana mereka
berinteraksi dengan sisa kode Anda.
Tapi mereka adalah dua yang utama yang kita telah datang dalam kontak dengan sejauh
kursus.
>> Jenis.
Ini baik untuk mengingat berapa banyak setiap jenis diwakili oleh atau bagaimana
banyak byte masing-masing jenis requires--
int, 4 byte; char, 1 byte.
Float 4 bytes.
Apa ganda?
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Ya, jadi pelampung tapi dua kali lipat ukuran.
Bagaimana panjang?
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: OK.
Apa yang dimaksud dengan panjang?
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Ya, dua kali lipat int.
Ya.
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Long [Tak terdengar].
Dan kemudian lama adalah dua kali lipat.
>> AUDIENCE: Tidak, tidak.
Sebuah panjang hanya sebuah int.
Hal ini tergantung pada arsitektur sebelum [Tak terdengar]
dan int memiliki ukuran yang sama.
[Tak terdengar].
>> SPEAKER 1: Jadi panjang dan int adalah sama.
Dan kemudian lama ganda int.
Keren.
Dan kemudian, apa jenis terakhir?
>> AUDIENCE: Pointer.
>> SPEAKER 1: Ya, jadi kita belajar sedikit tentang pointer.
Dan terlepas dari apa pointer adalah menunjuk untuk-- bisa menjadi bintang arang
atau int star--
itu selalu 4 byte untuk pointer.
Pertanyaan tentang hal itu?
Ya?
>> AUDIENCE: [Tak terdengar]?
>> SPEAKER 1: Jadi panjang dan int adalah sama dalam alat CS50 ini.
>> AUDIENCE: Alat benar-benar dipertukarkan.
>> SPEAKER 1: Ya.
Jadi panjang panjang dua kali lipat int itu.
>> AUDIENCE: ini adalah 32 bit?
>> SPEAKER 1: 32 bit, ya.
>> AUDIENCE: Jadi [Tak terdengar]?
>> SPEAKER 1: Ya, jika tidak secara eksplisit mengatakan, Anda
harus mengasumsikan 32 bit.
>> AUDIENCE: Ini akan mengatakan sesuatu seperti asumsi
arsitektur seperti alat.
Untuk 64 bit, satu-satunya hal yang perubahan yang rindu dan pointer.
Mereka berdua [Tak terdengar].
>> SPEAKER 1: Ya?
>> AUDIENCE: Pertanyaan.
Jadi di salah satu kuis praktek, itu bertanya tentang int unsigned.
Jadi bagaimana yang ditentukan dari int [Tak terdengar]?
>> SPEAKER 1: An unsigned di juga 4 byte.
Tapi apa yang berbeda tentang ditandatangani int dan unsigned int?
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Benar.
Satu dapat mewakili nilai-nilai negatif.
Tapi bagaimana melakukan itu?
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Ya, menghemat 1 bit untuk mewakili tanda.
Menandatangani memiliki satu bit yang merupakan tanda.
Dan unsigned saja semua positif.
>> AUDIENCE: OK.
Jadi Anda mengatakan bahwa ganda dua kali ukuran pelampung?
>> SPEAKER 1: Double dua kali ukuran pelampung, ya.
>> AUDIENCE: Bagaimana pointer ke lama [Tak terdengar]?
>> SPEAKER 1: Jadi pertanyaannya adalah bagaimana pointer ke long-- panjang
bagaimana adalah bahwa hanya empat byte ketika panjang panjang 8 byte.
Jadi ingat apa yang pointer, dasarnya, di nilai yang sangat dasar.
>> AUDIENCE: [Tak terdengar].
>> SPEAKER 1: Ya, jadi pointer hanya lokasi memori.
Jadi tidak peduli berapa banyak ruang pointer yang menunjuk ke.
Ini hanya membutuhkan 4 bytes untuk melacak dari lokasi memori.
Ada pertanyaan lain?
Keren.
>> Jadi hal terakhir yang saya miliki adalah output standar.
Anda harus menggunakan mereka sering cukup bahwa Anda ingat.
Tapi ini adalah ketika kita menggunakan printf, misalnya.
Dan kami memiliki penampung ini yang disebut kode Format.
>> Jadi persen c char, persen i untuk int, dan kami juga dapat menggunakan persen d.
Ini hal yang sama.
Tapi, secara umum, dalam CS50 kami mencoba menggunakan persen i.
Persen f untuk float.
Persen ld lama panjang dan persen s string.
>> Demikian pula, kita telah menggunakan beberapa urutan escape ini.
Misalnya, backslash n untuk baris baru.
Ini hanya untuk ketika Anda format kode untuk cetak f.
Ya?
>> AUDIENCE: Apa persen d untuk?
>> SPEAKER 1: Jadi pertanyaannya adalah apa persen d untuk?
Persen d untuk int.
Persen d dan i persen adalah sama.
>> AUDIENCE: Apa perbedaan antara backslash n dan backslash r?
>> SPEAKER 1: Jadi pertanyaannya adalah apa perbedaan antara reaksi n dan
r reaksi?
Saya pikir backslash r Ini--
>> AUDIENCE: Jadi backslash r hanya menyiratkan kembali ke awal baris
tanpa benar-benar pergi ke baris baru.
Jadi jika Anda mencetak backslash r dan Anda kembali ke awal baris
maka Anda mencetak lebih banyak barang, Anda menimpa hal-hal yang sudah di
[Tak terdengar].
Padahal, n benar-benar pergi ke baru line dan pergi ke [Tak terdengar].
>> SPEAKER 1: Nah, pertanyaan lain?
Baiklah.
Aku akan menyerahkan pada Dan yang akan melanjutkan.
>> [Tepuk Tangan]
>> DAN: Semua righty.
Jadi saya akan berbicara tentang berbagai lain berbagai ide dari kelas yang
kira-kira mewakili dua minggu dan awal minggu ketiga mulai dari
dengan casting, yang hanya cara mengobati nilai dari jenis tertentu seperti
nilai dari tipe yang berbeda.
Jadi kita bisa melakukan ini dengan karakter untuk int, mengapung untuk int, dan
rindu lama untuk menggandakan.
>> Semua hal ini dapat digunakan sebagai cara mengobati beberapa nilai numerik
dikurangi arang karena beberapa lainnya nilai numerik.
Jadi ada beberapa masalah dengan ini, Tentu saja, yang datang ketika Anda melemparkan
hal-hal seperti mengapung untuk int.
Jadi ini adalah sedikit aneh.
Kami memiliki pelampung yang 1.31.
Kami kalikan dengan 10.000.
Dan kemudian kami cetak sebagai int.
Apa output ini?
10.000 kali 1.31.
Jadi 13.000, adalah bahwa menebak?
>> AUDIENCE: Saya pikir itu 10.000.
>> DAN: Jadi aku mengalikannya dengan 10.000 sebelum aku casting.
>> AUDIENCE: Oh.
Tidak akan ada satu 9 dan beberapa 0 angka?
>> DAN: Anda mungkin memiliki beberapa aneh digit.
Jadi benar, itu 1,3 kali 10.000.
Jadi itu 13.000.
Dan weird-- tambahan ini
>> AUDIENCE: 13,100.
>> DAN: 13,100.
Terima kasih, Rob.
Dan weirdness-- tambahan ini
ini 9,9--
hanya karena pengecoran ini akhirnya pembulatan ke bawah di mana
tidak seharusnya.
Ya.
>> AUDIENCE: Casting terjadi setelah hal lain?
>> DAN: Jadi karena saya memiliki ini di cetak, melakukan perkalian ini sebelum
melakukan pengecoran ini.
>> AUDIENCE: [Tak terdengar].
>> DAN: Saya pikir itu akan dilemparkan pertama, yeah, yang akan 10.000.
Ada lagi?
Keren.
Jadi ini adalah 13,099.
Mengapa hal ini terjadi?
Ketidaktepatan.
>> Mengapung tidak sempurna.
Mereka hanya dapat mewakili angka ke sejumlah angka penting.
Jadi jika kita mencetak 8 buah ara sig on mengambang ini, kita mendapatkan semacam
jelek mencari nomor.
Dan itu karena 1.31 tidak bisa secara akurat diwakili oleh sederhana
kekuatan dua dalam mesin.
Jadi akhirnya mengambil yang paling dekat menebak, yang berakhir
menjadi sedikit rendah.
Masuk akal?
OK.
>> Sekarang, beralih adalah cara yang berbeda dari melakukan pernyataan bersyarat di mana semua
kita pedulikan adalah variabel tunggal.
Jadi, dalam contoh khusus ini, kami mendapatkan bilangan bulat dari pengguna.
Dan kemudian kita melihat apa integer yang.
Agaknya, itu nomor antara satu dan empat.
Itulah apa yang kita minta.
>> Jadi Anda melakukan switch nama variabel.
Kemudian Anda mengatur kasus mungkin nilai-nilai itu bisa.
Jadi huruf satu, mengatakan itu rendah.
Dan kemudian Anda istirahat untuk keluar kondisi saklar sehingga
Anda tidak terus.
>> Dalam case-- berikutnya
sehingga kasus dua kasus three--
jika itu terjadi dua itu hanya turun ke bawah untuk baris pertama dari kode yang dilihatnya sebagai dengan
huruf tiga sampai melihat istirahat.
Jadi alasan Anda mendapatkan kasus yang hanya cetak rendah adalah karena saya
memiliki istirahat ini di sini.
Jika saya, katakanlah, diabaikan break-- ini jika saya melemparkan breakaway-- ini
itu akan mencetak rendah, dan kemudian akan mencetak tengah, dan kemudian akan pecah.
>> Jadi istirahat adalah bagian penting dari beralih kondisi dan
mereka harus berada di sana.
Setiap kasus yang tidak dinyatakan secara eksplisit ditangani secara default
kasus saklar dan harus dienyahkan.
>> AUDIENCE: Jadi 1, 2, 3, dan 4 akan n?
>> DAN: Nilai-nilai yang n dapat.
Ya.
Ya?
>> AUDIENCE: Jadi ketika Anda memiliki bahwa [Tak terdengar]?
>> DAN: Anda akan mencetak rendah, dan kemudian itu akan mencetak tengah, dan
maka akan hancur.
>> AUDIENCE: Mengapa itu mencetak tengah jika [Tak terdengar]?
>> DAN: Jadi segala sesuatu di bawah kasus sebelum istirahat berada di bawah.
Jadi kasus satu cetak kasus di bawah satu seperti cetak berikut ini.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Jadi nomor ini hanya khusus nilai bahwa variabel ini
dapat mengambil, kan?
Apakah itu masuk akal?
Ya.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya, kasus dua akan mencetak tengah dan kemudian istirahat.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Saya pikir setiap?
Apa tipe data lain Anda dapat beralih?
>> AUDIENCE: Anda dapat beralih atas setiap jenis data.
Tapi itu hanya berarti apa-apa atas karakter dan int dan hal-hal seperti itu, karena
jika Anda beralih pointer yang tidak benar-benar masuk akal,
beralih beban, jika bahkan mari kita Anda melakukan itu, karena floating point
dalam presisi, Anda tidak akan benar-benar ingin melakukan itu pula.
Jadi cukup banyak, hanya int dan karakter dan hal-hal seperti itu.
>> DAN: Ya, itu ketika Anda memiliki eksplisit nilai-nilai yang Anda tahu, saya pikir, bisa
bahwa switch sebenarnya berguna.
Baik?
OK.
>> Lingkup adalah rentang bahwa dinyatakan variabel meluas.
Jadi dalam potongan kecil ini kode saya, akan penuh dengan kesalahan.
Dan alasannya adalah saya menyatakan int ini i dalam lingkup ini untuk loop.
Dan kemudian saya mencoba untuk referensi yang i luar itu untuk lingkup lingkaran.
>> Jadi pada dasarnya, Anda dapat berpikir tentang ruang lingkup sebagai sesuatu yang Anda menyatakan
dengan dalam satu set kurung kurawal hanya ada dalam kurung kurawal tersebut.
Dan jika Anda mencoba dan menggunakan variabel yang luar tersebut kurung kurawal, Anda akan
mendapatkan error dari compiler.
Ya?
>> AUDIENCE: Jadi yang satu ini tidak bekerja?
>> DAN: Ini tidak bekerja, ya.
Strings.
String char *.
Mereka persis sama.
Mereka hanya pointer ke karakter.
Dan setiap string yang Anda miliki harus berakhir dengan backslash nol, yang hanya
konvensi c.
>> Hal ini disebut terminator NULL.
Dan NULL--
modal N, modal U, modal L, modal L--
tidak sama dengan Terminator NULL.
Ini adalah pointer.
Ini adalah karakter.
Mereka sangat berbeda.
Ingat itu.
Ini akan menjadi pada kuis, mungkin.
Saya belum melihat kuis.
Ya?
>> AUDIENCE: Jadi NULL adalah, katakanlah, pointer?
>> DAN: Ya.
>> AUDIENCE: Apa [Tak terdengar]?
>> DAN: Jika, katakanlah, malloc disebut ketika Anda tidak memiliki cukup memori untuk mendapatkan
ukuran yang Anda minta apa pun, malloc akan kembali NULL.
Ini, pada dasarnya, setiap kali fungsi adalah seharusnya mengembalikan pointer, Anda
perlu memeriksa terhadap NULL karena NULL adalah benar ingin memberikan sambutan yang cukup
itu, semacam, nilai sampah.
Ini nol sejauh pointer pergi.
>> Setiap kali Anda memanggil fungsi, yang mengembalikan pointer.
Anda akan ingin memeriksa untuk memastikan bahwa pointer yang tidak NULL
karena NULL sangat umum.
Ini semacam pengembalian sampah.
Jadi jika sesuatu yang tidak tepat, hanya kembali NULL sebagai gantinya.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya, dan itu ini.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Eja itu karena hal ini.
Ini adalah terminator NULL.
Ini huruf kecil N-U-L-L jika Anda ejaan itu.
>> AUDIENCE: Dan aku hanya pergi kembali dan diuji.
Dan jika Anda mencoba untuk menempatkan floating point nilai ke switch, itu akan berteriak pada Anda
mengatakan, pernyataan membutuhkan ekspresi tipe integer.
>> DAN: Ini dia.
Tapi ya, apa lagi pertanyaannya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Jadi modal N, modal U, modal L, modal L merupakan hal c yang sebenarnya.
Ini adalah pointer NULL dan akan hanya diperlakukan seperti itu.
Anda tidak akan pernah mencoba dan mantra Karakter NULL dan melihat
cara lain dari ini.
Ya?
>> AUDIENCE: Jadi kembali ke char max atau sesuatu dalam catatan, kan
mewujudkan fungsi yang sama sebagai [Tak terdengar]?
>> AUDIENCE: Jadi yang Anda maksud kembali max char dari getchar, atau
apapun itu?
>> AUDIENCE: Ya.
>> AUDIENCE: Ya, jadi umum istilah untuk semua hal-hal
adalah nilai-nilai sentinel.
Jadi seperti kembali int max dari getInt dan char max dari getchar, itu
seharusnya seperti, baiklah, jika hal-hal ini kembali kepada kita,
sesuatu yang tidak beres.
>> Untuk pointer, kita hanya kebetulan memiliki nilai sentinel ini bahwa setiap orang
setuju atas.
Dan ini adalah hal Anda kembali bila ada yang salah.
Jadi max char adalah apa yang kita gunakan untuk mewakili sesuatu
seperti NULL atau getchar.
>> AUDIENCE: Jadi jika Anda menguji getchar, bisa Anda hanya menempatkan NULL?
Apakah itu membuat perbedaan?
>> DAN: Anda tidak bisa hanya memeriksa NULL.
Anda harus memeriksa arang max karena nilai kembali dari fungsi ini
karakter tidak pointer.
Ya?
>> AUDIENCE: Pertanyaan ini menanyakan untuk panjang string.
Apakah itu termasuk karakter NULL?
>> DAN: Tidak
Dan itu sebenarnya bagaimana panjang string tahu untuk berhenti karena ia pergi melalui
array dari karakter sampai itu melihat karakter NULL.
Dan kemudian itu seperti, semua benar, aku sudah selesai.
>> AUDIENCE: [Tak terdengar] lima?
>> DAN: Halo akan menjadi lima.
Yep.
Jadi array adalah kontinu blok memori.
Mereka memiliki akses cepat dengan mengatakan nama array dan kemudian, di keriting
kawat gigi, indeks apa pun yang Anda ingin pergi untuk, mereka diindeks dari nol sampai
panjang array dikurangi 1.
>> Dan mereka dinyatakan oleh tipe hal yang Anda menyimpan di
array, nama array, dan kemudian apapun ukurannya dari array.
Jadi ini adalah array char panjang enam yang memiliki nilai-nilai ini.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Jika Anda memiliki apa yang sedang terjadi ke array sudah dibuat.
Jadi Anda bisa menentukan ini bukan karena, mengatakan, char, apa pun nama Anda
array, kurung kosong sama keriting penjepit H koma E koma L koma L koma
O koma NULL karakter dan penjepit keriting.
Itu juga akan bekerja sebagai deklarasi.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Kemudian Anda harus memiliki ukuran sudah dibuat.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya.
Semua righty.
Argumen baris perintah adalah cara mendapatkan masukan dari pengguna sebagai
argumen untuk utama.
Main membutuhkan dua argumen.
Jumlah argumen yang sedang diteruskan baris perintah dan
String vektor atau array string dari semua argumen.
>> Jadi jika saya, misalnya, disebut fungsi seperti titik out 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 kasus tertentu.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Unsur terakhir dalam array karena array adalah panjang argc ditambah
salah satu ARGB, elemen terakhir adalah pointer NULL.
Ini adalah argc ditambah 1.
Jadi dalam hal ini saya hanya berkata, itu 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 dari argc akan NULL.
>> Dan itulah pointer NULL.
Ya.
Dan itu karena string bintang char adalah pointer.
Jadi itu harus tipe yang sama.
Ya?
>> AUDIENCE: Dua pertanyaan.
Jadi satu, apa perbedaan antara GetString ini dan lainnya dari satu jenis
di mesin penggunaannya?
Dan dua, apakah disimpan dalam memori baru Anda?
Jadi seperti, GetString akan menjadi [Tak terdengar]?
>> DAN: Mana itu disimpan?
Aku tidak tahu di mana itu disimpan.
>> AUDIENCE: Jadi, sebenarnya, Anda tahu bagaimana setiap fungsi Anda menyebutnya itu argumen
disimpan dalam stack?
Jadi argc dan argv argumen to main dan mereka berada di stack, atau benar-benar
tepat di atas apa yang Anda pikirkan sebagai awal stack.
Apa bagian lain dari pertanyaan?
>> AUDIENCE: Jadi apa [Tak terdengar]?
>> DAN: Ya, itu hanya cara yang berbeda mendapatkan masukan dari pengguna.
Sedikit lebih efisien dan yang satu ini itu handier untuk script karena Anda
hanya bisa lewat argumen untuk utama Anda Fungsi daripada harus menunggu
untuk pengguna jika Anda tidak memiliki pengguna.
>> AUDIENCE: Dan yeah, dapatkan string akan [Tak terdengar].
Ini akan menyimpan barang-barang yang Anda butuhkan.
>> DAN: Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya, argv 0 selalu mencakup dot slash panggilan fungsi.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya, setiap dari argumen berakhir dalam karakter NULL karena mereka
adalah string.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya, argv argc adalah pointer NULL.
>> AUDIENCE: [Tak terdengar]?
>> DAN: Oh yeah.
Ya, maaf.
>> AUDIENCE: Jadi [Tak terdengar]?
>> DAN: Jadi pertanyaannya adalah jika Anda memiliki baris perintah dot slash dot out 1, 2,
akan jumlah baris perintah argumen menjadi dua atau akan tiga?
>> AUDIENCE: Saya pikir itu tidak benar-benar peduli.
Saya cenderung mengatakan, oh, Anda tidak lulus argumen baris perintah ketika,
jelas, Anda disebut fungsi.
Jadi saya cenderung vokal mengecualikan fungsi dari baris perintah
argumen meskipun itu termasuk dalam argv.
>> DAN: Tapi jika itu di test-- yang
yeah dan juga jika Anda mengatakan sesuatu seperti argc sama dengan 3,
Anda berada di aman berdiri.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Saya pikir jika bukan memanggil ini di argc dan argv tali kurung
tapi terus jenis yang sama dan hanya disebut mereka sesuatu yang berbeda seperti
dan b, akan masih bekerja?
Dan masih akan bekerja, Anda akan hanya--
alih-alih menggunakan argc-- Anda akan menggunakan a dan b.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Jadi pertanyaannya adalah GetString adalah akan menyimpan memori di heap
karena GetString adalah char *.
Yang menyimpan memori di heap karena Panggilan sekarang malloc dalam aktual
pelaksanaan GetString.
OK, pindah.
>> Keamanan.
Jadi untuk benar-benar aman, Anda mengandalkan tidak satu dan Anda mengizinkan ada satu akses ke
informasi Anda, yang mengapa semua orang membangun mesin mereka sendiri,
sistem operasi mereka sendiri, semua mereka program dari awal, dan jelas
tidak terhubung ke mesin lain melalui internet.
Jadi komputer yang tidak aman.
Mereka benar-benar.
Kita harus percaya orang lain.
>> Dan gagasan keamanan adalah bahwa Anda mencoba untuk membatasi jumlah
kepercayaan yang Anda butuhkan.
Dan salah satu cara Anda melakukan itu adalah melalui kriptografi.
Kriptografi adalah, pada dasarnya, kami memiliki rahasia.
>> Kadang-kadang kita harus melewati rahasia kami bersama melalui, katakanlah, internet atau
hal-hal lain.
Dan kita tidak ingin orang-orang untuk mengetahui rahasia-rahasia ini.
Jadi kami mengenkripsi rahasia kami ke jalan yang kami harap tidak ada yang tahu.
>> Jadi kita used--
melalui program kelas ini ini
hal-hal seperti cipher Caesar dan [Tak terdengar], yang keduanya sangat, sangat
cara aman dari enkripsi hal.
Mereka mudah untuk mencari tahu apa yang mereka dan apa rahasia Anda.
Dunia nyata menggunakan lebih banyak skema enkripsi rumit.
Dan kami tidak akan masuk ke lebih dari itu.
>> Debugging.
GDB adalah yang terbaik.
Aku akan menekankan hal ini lagi.
Gunakan GDB sepanjang waktu setiap kali Anda memiliki masalah.
Perintah yang berguna dalam GDB adalah istirahat, yang Anda lulus baik garis
nomor, nama fungsi, pada dasarnya di mana dalam kode Anda Anda ingin berhenti,
dan dapat mengambil kendali.
>> Cetak mengambil variabel dan mencetak apa variabel yang pada saat itu
titik dalam pelaksanaannya Anda.
Berikutnya bergerak eksekusi Anda sepanjang satu langkah.
Dan langkah langkah dalam fungsi dalam pelaksanaan Anda.
>> Hal-hal lain dijalankan, yang adalah bagaimana Anda benar-benar menjalankan kode Anda.
Lanjutkan mengambil semua langkah yang diperlukan untuk sampai ke titik istirahat berikutnya.
Dan ada banyak, banyak orang lain.
Lihatlah mereka.
Mereka besar.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya, yang merupakan debugger.
Jadi debugger merupakan program yang memungkinkan Anda men-debug program anda.
Ini bukan program yang menemukan bug untuk Anda, meskipun itu akan menjadi besar.
>> Dan terakhir bagi saya adalah pencarian.
Jadi jenis pencarian yang kita bicarakan tentang di kelas ini adalah pencarian linear,
yang hanya bahwa Anda melihat melalui masing-masing unsur ruang pencarian, satu
elemen pada suatu waktu, sampai Anda menemukan apa Anda sedang mencari atau sampai Anda mencapai
akhir ruang pencarian Anda di mana mengarahkan Anda mengatakan bahwa Anda tidak bisa menemukan
elemen yang Anda cari.
Dan ini membutuhkan waktu yang terbaik konstan, yang merupakan 0 dari 1 dan pada linear terburuk
waktu, yang adalah 0 dari n.
>> Pencarian biner, yang membutuhkan elemen mesum.
Anda pergi ke tengah elemen Anda, melihat apakah elemen yang Anda cari
lebih besar atau lebih kecil dari elemen bahwa Anda berada di tengah.
Itu itu lebih besar, Anda mengatakan bahwa bagian bawah pencarian Anda ruang Anda
lokasi saat ini, tengah, dan Anda me-restart proses.
Jika lebih kecil, Anda melihat mengatakan bahwa yang-- ya, ada apa?
>> AUDIENCE: [Tak terdengar]?
>> DAN: Ya.
Apapun jenis yang telah diajarkan di kelas adalah permainan yang adil untuk ujian.
>> [Tertawa]
>> DAN: Dan kenyataan bahwa Anda tidak punya untuk melakukannya untuk satu set masalah, itu adil
game untuk tes.
>> AUDIENCE: Bisakah kita pergi lebih dari itu bagaimana untuk--
>> DAN: Ini akan pergi lebih dari.
>> SPEAKER 2: sebenarnya kode untuk [Tak terdengar] ada di study.cs50.net.
Jadi jika Anda melihat masalah praktek di halaman merge semacam
study.cs50.net, ada kode untuk menerapkan menggabungkan semacam.
Jadi Anda tidak perlu menerapkan sendiri malam ini.
Tapi pastikan Anda memahami agak dari sekedar menghafal itu.
>> AUDIENCE: [Tak terdengar]?
>> SPEAKER 2: The merge sort halaman di study.cs50.net, ada praktek
masalah itu, jika Anda klik melalui masalah, di akhir ada
solusi, yaitu penggabungan pelaksanaan semacam.
Tapi pastikan Anda memahaminya bukan hanya menghafal itu
atau menyalin ke bawah.
>> AUDIENCE: Dan sempurna valid masalah untuk ujian akan
sesuatu seperti inilah daftar.
Apa daftar ini terlihat seperti setelah satu langkah dari pilihan jenis atau
insertion sort atau apa pun.
Salah satu iterasi penuh daftar.
Jadi bahkan jika Anda tidak berakhir perlu kode untuk itu, Anda perlu memahaminya
cukup untuk mengetahui bagaimana itu akan untuk memodifikasi array ini.
>> DAN: Itu untuk saya.
>> [Tepuk Tangan]
>> LUCAS: Hey everyone.
Nama saya Lucas.
Aku akan berbicara tentang rekursi, semua jenis-jenis yang telah kita pelajari, dan
sedikit dari semua pointer.
OK?
Jadi pertama-tama, rekursi.
Apa artinya untuk mengatakan bahwa fungsi rekursif?
>> AUDIENCE: Menyebut dirinya.
>> LUCAS: OK, menyebut dirinya, ya.
Jadi seperti gambar ini, misalnya.
Ini seperti gambar di dalamnya gambar dan sebagainya.
Jadi misalnya, Anda dapat harus-- sebagai Dan yang berbicara tentang pencarian biner.
Salah satu cara di mana pencarian biner adalah rekursif adalah kenyataan bahwa Anda
berusaha untuk menemukan nomor.
Jadi Anda pergi ke tengah.
Dan kemudian Anda memeriksa apakah nomor ada di kiri dan di kanan.
>> Dan kemudian jika Anda mencari tahu jumlahnya akan berada di sebelah kiri, itu sama
hal seperti melakukan pencarian lagi tapi hanya di sebelah kiri daftar.
Jadi begitulah kedengarannya seperti itu adalah rekursif.
Jadi itu sebabnya kalian punya rekursif solusi untuk merge sort.
>> OK, jadi inilah contoh.
Jadi, mari kita mengatakan bahwa saya ingin memilih semua angka dari 1 sampai n.
Saya bisa menyadari bahwa jumlah n Nomor adalah n ditambah n dikurangi 1 hingga 1.
Tapi kemudian, jika saya melihat n dikurangi 1 ditambah n minus 2 ditambah 1, itu sama
hal sebagai angka menjumlahkan sampai n dikurangi 1.
Jadi saya bisa mengatakan jumlah jumlah yang sama sama n ditambah jumlah n dikurangi 1.
Apakah itu masuk akal?
>> Dan saya juga akan memiliki sesuatu yang lain disebut kasus dasar, yaitu bahwa
jumlah dari angka sampai nol akan menjadi nol.
Jadi, segera setelah saya mendapatkan ke nomor nol, saya berhenti menghitung.
Apakah itu masuk akal?
>> Jadi, inilah contoh bagaimana Saya bisa menerapkan itu.
Jadi saya memiliki fungsi ini dalam beberapa.
Yang mengambil integer n.
Jadi di sini saya pertama memeriksa apakah n adalah kurang atau sama dengan nol.
Jadi jika kurang atau sama dengan nol, saya kembali nol, yang merupakan kasus dasar kami.
Jika tidak, saya hanya dapat kembali n ditambah jumlah dari angka-angka dari
yang n minus satu.
Masuk akal?
OK.
>> Jadi, inilah apa yang tampak seperti.
Anda memiliki jumlah 2 equals 2 ditambah jumlah 1.
Dan beberapa dari 1 adalah 1 ditambah jumlah 0, yaitu 0.
Masuk akal?
Jadi jika kita melihat tumpukan Anda Program, ini adalah apa yang tampak seperti.
>> Pertama, kita memiliki fungsi utama.
Dan kemudian fungsi utama disebut sum 2.
Dan kemudian sum 2 yang akan dikatakan, oh, jumlah 2 sama dengan 2 ditambah jumlah satu.
Jadi saya menambahkan jumlah 1 ke stack.
Dan jumlah 1 akan memanggil jumlah 0, yang juga akan ditambahkan
ke stack.
Dan kemudian masing-masing orang-orang ini yang di atas yang lain harus kembali
sebelum yang lain bisa terus berjalan.
>> Jadi misalnya, di sini, jumlah 0, pertama, akan kembali 0.
Dan kemudian pilih jumlah 1.
Kemudian jumlah 1 akan kembali 1 untuk jumlah dari 2.
Dan akhirnya, jumlah 2 akan untuk kembali 3 sampai utama.
Apakah itu masuk akal?
>> Ini benar-benar penting untuk memahami bagaimana stack bekerja dan mencoba untuk
melihat apakah itu masuk akal.
OK, jadi penyortiran.
Jadi mengapa menyortir penting, pertama-tama?
Mengapa kita harus peduli?
Siapa saja?
Berikan saya sebuah contoh?
Ya?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Ya, OK.
Jadi Anda dapat mencari lebih efisien.
Itu cara yang baik.
Jadi, misalnya, kita memiliki banyak hal, sebenarnya, dalam hidup kita yang
diurutkan.
Misalnya, kamus.
>> Ini sangat penting untuk memiliki semua kata-kata dalam beberapa jenis agar kita
dapat mengakses dengan mudah.
Jadi itulah apa yang ia katakan.
Anda dapat mencari lebih efisien.
Pikirkan betapa sulitnya akan memiliki kamus di mana kata-kata tersebut di
urutan acak.
Anda akan harus melihat, cukup banyak, setiap kata sampai Anda menemukan
kata yang Anda cari.
>> Jika Anda menggunakan Facebook juga, ketika Anda melihat teman Anda, Anda
akan melihat bahwa Facebook membuat Anda teman dekat adalah di atas yang
bahwa Anda tidak berbicara dengan yang banyak.
Jika Anda pergi semua jalan ke bagian bawah daftar teman Anda, Anda akan melihat
orang yang mungkin Anda bahkan tidak ingat bahwa Anda berteman dengan.
Dan itu karena macam Facebook Teman-teman Anda berdasarkan bagaimana
dekat Anda dengan mereka.
>> Jadi mengorganisasi data.
Juga Pokemon.
Jadi, Anda melihat bahwa semua Pokemons memiliki nomor.
Dan itu seperti mudah cara mengakses data.
>> AUDIENCE: Mengakses Pokemon.
>> LUCAS: Ya.
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Yep.
OK, jadi semacam seleksi.
Seleksi semacam akan memilih Nilai disortir terkecil dari daftar masing-masing
waktu di setiap iterasi.
Ini semacam seperti semacam yang Anda lakukan di kepala Anda ketika Anda mencoba untuk
mengurutkan daftar di tangan.
>> Pada dasarnya, semua yang Anda lakukan adalah Anda melihat untuk jumlah terkecil.
Anda memasukkannya ke dalam daftar diurutkan.
Dan kemudian Anda mencari selanjutnya nomor terkecil.
Dan kemudian Anda terus melakukan itu dan sebagainya.
>> Jadi selection sort pada dasarnya adalah Anda pilih setiap kali terkecil
Nilai disortir.
Masukan pada akhir diurutkan bagian dari daftar.
Dan terus melakukan itu.
Jadi mari kita cepat melihat apa ini tampak seperti.
Jadi, inilah yang diurutkan dan daftar disortir.
>> Jadi untuk diurutkan dari daftar, itu awalnya kosong.
Dan kemudian aku akan memilih nomor terkecil di sini, yaitu 2.
Jadi saya mendapatkan nomor 2 dan saya menaruh di depan daftar.
Dan kemudian saya mencari terkecil berikutnya unsur, yaitu 3.
Jadi saya letakkan di akhir daftar diurutkan.
Dan kemudian saya terus melakukan itu.
Saya menemukan 4 dan meletakkannya di akhir.
Cari 5 dan meletakkannya di akhir.
>> Dan melihat bagaimana semua orang kali Saya mengatakan meletakkannya di akhir adalah,
pada dasarnya, swapping dua nilai.
OK?
Dan kemudian yang terakhir, Anda hanya memiliki satu elemen lagi.
Jadi itu sudah disortir.
>> OK, jadi insertion sort.
Insertion sort Anda akan memiliki juga bahwa hal karena telah a disortir dan
sebuah list tak berurut.
Satu-satunya hal adalah bahwa setiap kali Anda menambahkan sebuah elemen ke diurutkan
daftar, Anda hanya memilih elemen yang adalah di depan daftar disortir.
Dan kemudian Anda akan menemukan apa Posisi itu harus di diurutkan
bagian dari daftar.
>> Mari kita lihat apa ini begitu ini lebih masuk akal.
Jadi pada awalnya, misalnya, saya sedang mencoba untuk memasukkan nomor tiga di
diurutkan bagian dari daftar.
Jadi daftar tidak memiliki apa-apa.
Jadi aku hanya bisa menempatkan nomor 3.
>> Sekarang, saya ingin menambahkan nomor 5 sampai bagian diurutkan dari daftar.
Jadi saya melihat nomor 5.
Saya melihat bahwa itu lebih besar dari 3.
Jadi saya tahu bahwa itu harus setelah 3.
Jadi saya menempatkan 3 dan 5.
>> Lalu aku ingin memasukkan nomor 2.
Saya melihat bahwa nomor 2 adalah benar-benar berlangsung maka kedua 3 dan 5.
Jadi saya benar-benar harus menempatkan semua cara awal daftar.
Jadi saya harus, jenis, menggeser semua unsur dalam daftar diurutkan sehingga saya bisa
membuat ruang untuk nomor 2.
>> Lalu aku melihat nomor 6.
Saya melihat bahwa itu harus setelah 5.
Jadi saya menaruhnya di sana.
Dan akhirnya, saya melihat nomor 4.
Dan saya melihat seharusnya antara 3 dan 5.
Dan kemudian aku menaruhnya di sana dan pergeseran semua elemen lain.
Masuk akal?
>> Bubble Sort.
Jadi bubble sort pada dasarnya adalah apa yang Anda akan do-- kita menyebutnya gelembung
semacam karena Anda pergi melalui list-- yang itu sebenarnya lebih baik jika saya hanya menunjukkan
Anda suka ini--
dan Anda akan membandingkan angka yang berdekatan.
Dan Anda akan menukar mereka posisi jika mereka tidak
dalam urutan yang benar.
>> Jadi pada dasarnya, apa yang akan terjadi di sini, misalnya,
Anda memiliki 8 dan 6.
Anda tahu bahwa terurut akan sebenarnya 6 dan 5, kan?
Jadi Anda akan menukar perintah.
Lalu aku melihat 8 dan 4 di sini.
Dan saya melakukan hal yang sama.
Saya swap lagi.
Dan akhirnya, 2 dan 8.
Saya juga swap mereka.
>> Ini disebut Bubble Sort karena setelah setiap iterasi ini, sebenarnya,
jumlah terbesar dalam daftar mendapat semua Dalam perjalanan ke akhir daftar.
Apakah itu masuk akal?
Karena terus swapping dan bergerak ke kanan.
>> OK, jadi ini adalah iterasi kedua.
Ini akan menjadi hal yang sama.
Aku akan melakukan satu swap dan kemudian yang terakhir.
Saya tidak ada swap dan daftar diurutkan.
Jadi dalam Bubble Sort, kita pada dasarnya tetap akan melalui daftar dan swapping
hal sampai saya menyadari bahwa saya tidak melakukan setiap swap melakukan iterasi itu, yang
berarti bahwa daftar sudah diurutkan.
Masuk akal?
>> Mari kita bicara sedikit tentang waktu berjalan.
Jadi kalian ingat Big O, Omega, dan Theta?
Ya?
OK, apa yang Big O, pertama-tama?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Ya, itu disebut kasus terburuk runtime, yang hanya berarti bahwa itu
berapa banyak yang Anda harapkan program untuk mengambil untuk menjalankan.
Seperti, dalam hal of--
di case-- ini n.
Jumlah elemen dalam daftar dalam kasus terburuk.
Seperti, dalam kasus terburuk mungkin.
>> Jadi untuk Bubble Sort, misalnya, kami memiliki O Besar n persegi.
Mengapa kita memiliki itu?
Mengapa Bubble Sort Big O n persegi?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Ya, jadi kasus terburuk akan bahwa saya harus melakukan n iterasi.
Jadi masing-masing iterasi akan membawa elemen terbesar sampai akhir
daftar.
Jadi kasus terburuk adalah bahwa saya memiliki untuk melakukan hal n kali.
Dan untuk masing-masing kali, saya harus melakukan n swap karena saya harus membandingkan
masing-masing dua elemen.
Jadi itulah mengapa itu n kuadrat karena itu n kali n.
>> Kemudian, selection sort juga n persegi karena, untuk setiap iterasi, saya harus
melihat setiap elemen tunggal dalam daftar.
Dan kemudian menemukan terkecil, yang berarti bahwa saya harus
melihat melalui elemen n.
Dan aku harus melakukan itu n kali karena Saya harus memilih semua elemen n.
>> Sebuah insertion sort juga n persegi karena skenario terburuk akan
jadi, satu, saya harus memasukkan nomor n, kan?
Jadi saya sudah tahu bahwa aku akan memiliki n iterasi.
Tapi untuk setiap angka-angka, jika aku punya untuk melihat semua nomor di
daftar diurutkan dan menempatkan semua jalan di depan, yang akan n persegi
karena akan n kali n lagi.
Masuk akal?
Bagaimana omega?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Ini adalah skenario terbaik.
Jadi seperti, dalam banyak kali untuk menyortir, skenario terbaik adalah
ketika daftar sudah diurutkan.
Jadi Anda tidak benar-benar memiliki untuk melakukan sesuatu.
Bubble Sort memiliki yang terbaik skenario kasus n.
Apakah kalian tahu kenapa?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Ya, jika Anda melacak apakah data ransum punya swap atau
tidak, jika Anda memiliki sesuatu seperti diatur ke benar jika ada iterasi, jika
daftar sudah diurutkan, pada dasarnya, apa yang akan terjadi adalah aku akan
mencoba untuk swap setiap dua elemen yang berdekatan.
Aku akan melihat bahwa tidak ada swap.
Dan aku hanya kembali segera.
>> Jadi itu berarti bahwa saya hanya harus pergi melalui daftar satu waktu.
Jadi n karena saya melihat pada n elemen.
Mengapa selection sort n persegi?
>> Ya, bahkan jika daftar diurutkan, untuk setiap iterasi dari selection sort, saya
harus memilih elemen minimum.
Jadi itu berarti bahwa saya telah keluar untuk melihat di semua elemen dalam unsorted
daftar dan menemukan minimum untuk setiap iterasi.
Apakah itu masuk akal?
>> Dan pedang penyisipan n karena dalam kasus yang saya sedang mencoba untuk memasukkan
angka dan semua nomor, ketika saya mencoba untuk memasukkan mereka, saya melihat bahwa mereka
berada dalam posisi yang tepat.
Saya tidak harus pergi memeriksa semua lain nomor dalam daftar disortir.
Jadi itulah mengapa akan n.
Masuk akal?
Dan apa theta?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Apa, maaf?
Katakanlah lagi.
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Tepat.
Sehingga Anda dapat melihat bahwa hanya pilihan disimpan dalam Merge sort memiliki thetas.
Dan itu karena Anda hanya memiliki theta jika kedua Big O dan Omega adalah sama.
OK.
Dan akhirnya, menggabungkan semacam yaitu di log n.
>> Dan kemudian, sebagai Dan berkata, Merge sort adalah jenis seperti cara yang sama bahwa
Anda melakukan pencarian biner.
Jadi Anda mendapatkan daftar.
Dan Anda akan dipotong setengah.
Dan kemudian Anda memotong mereka di bagian yang lebih kecil.
Dan kemudian Anda menggabungkan mereka.
Kalian ingat itu, kan?
OK, seperti yang ia katakan.
>> OK, pointer.
Jadi apa adalah pointer?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Sebuah alamat.
OK.
Aku tahu bahwa David menunjukkan sekelompok video binky, dan hal menunjuk
satu sama lain.
Tapi saya suka berpikir tentang pointer hanya sebagai alamat.
Jadi itu adalah variabel yang akan untuk menyimpan alamat.
>> Jadi itu hanya variabel khusus ini yang empat byte panjang.
Ingat, bahwa pointer ke sesuatu yang selalu empat byte panjang untuk kami 32-bit
mesin sehingga kasus dengan alat.
Dan itu hanya memiliki lokasi dari variabel di dalamnya.
>> OK, jadi ada memori ini, pada dasarnya.
Jadi setiap blok memori sebenarnya memiliki label, yang merupakan alamat
memori slotty.
Jadi itu berarti bahwa saya dapat memiliki pointer menunjuk ke
salah satu alamat ini.
Jadi alasan mengapa kita akan menggunakan pointer adalah jika saya harus ingat lokasi
bahwa variabel tertentu adalah memori.
>> Dan kalian ingat bahwa salah satu dari mereka kasus adalah jika saya memiliki fungsi
jika saya telah benar-benar ingin Anda swap real, aku benar-benar
harus mengirim pointer.
Tidak variabel.
Apakah kalian ingat?
Perbedaan between--
apa namanya?
Memanggil dengan nilai dan memanggil dengan referensi, kan?
>> OK, ya.
Jadi memanggil dengan nilai.
Bila Anda hanya mengirim variabel ke fungsi Anda hanya mengirimkan nilai.
Jadi Anda benar-benar mengirimkan salinan variabel.
Dan program anda tidak peduli kalau variabel yang sama sebenarnya
membuat salinan.
>> Dan memanggil dengan referensi berarti bahwa Aku benar-benar mengirimkan salinan
pointer ke variabel.
Jadi itu berarti bahwa saya mengirim lokasi variabel tersebut.
Jadi merasakan saya memiliki lokasi variabel, ketika saya memanggil fungsi
dengan pointer, aku bisa benar-benar mengubah data yang berada di utama.
Masuk akal?
>> Meskipun, pointer adalah salinan, yang pointer masih memiliki alamat nyata
variabel yang saya ingin mengubah.
Masuk akal?
>> Jadi menciptakan pointer.
Ingat, pointer selalu memiliki jenis bahwa itu menunjuk
untuk kemudian bintang.
Dan kemudian Anda menempatkan nama.
Jadi ingat bahwa setiap kali Anda memiliki Bintang apa pun, itu seperti pointer ke
bahwa variabel apapun jenis yang Anda miliki.
>> Jadi di sini di bintang, misalnya, itu pointer dan integer.
Dan kemudian star char adalah pointer Char bintang dan sebagainya.
Ya?
>> AUDIENCE: Bagaimana jika kita memiliki pointer ke n untuk membintangi x.
Aku tahu yang menciptakan pointer ke x.
Apakah itu juga menyatakan x integer?
>> LUCAS: OK, jadi ketika Anda mengatakan bintang n x, Anda tidak menciptakan pointer ke
variabel x.
Anda sedang menciptakan sebuah pointer bernama x.
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Jadi ketika saya mengatakan bintang n x, aku mengatakan, hei, dalam memori, aku akan
mendapatkan salah satu dari tiga kotak.
Dan aku akan mengatakan bahwa itu akan menjadi x, yang
akan menjadi pointer.
Dan sesuatu yang menarik tentang pointer adalah bahwa kita mengatakan bahwa mereka memiliki
4 byte untuk mesin 32-bit.
Dan alasan untuk itu adalah karena 4 byte adalah 32-bit.
>> Dan mesin yang 64 bit sebenarnya memiliki alamat pointer
yang 64 bit panjang.
Jadi itu hanya berarti bahwa ukuran alamat di mesin berbeda.
>> Jadi Mengacu dan Dereferencing.
Ada dua operator yang kalian harus ingat.
Yang pertama adalah ampersand.
Yang kedua adalah bintang.
Jangan bingung dengan bahwa bintang dan ini berbintang karena ingat bahwa, dalam
hal ini, Anda memiliki bintang n.
>> Ini seperti semuanya bersama-sama.
Tidak ada bintang ruang n.
Jadi itu berarti bahwa itu jenis.
Ingat, bahwa ketika Anda memiliki bintang variabel, Anda
berbicara tentang jenis.
>> Bila Anda memiliki hanya bintang dan kemudian nama variabel, itu berarti bahwa
Anda dereferencing pointer, yang berarti bahwa Anda mencari di
pointer, menemukan alamat itu menunjuk ke, pergi ke alamat tersebut,
dan melihat setiap kali Anda telah ada.
Jadi saya katakan pada mahasiswa saya bahwa ketika Anda memiliki bintang, Anda harus berpikir bahwa ini
singkatan dari isi.
>> Jadi jika Anda memiliki pointer dan Anda melakukan pointer bintang, itu adalah
isi pointer.
Jadi Anda pergi ke apa pun itu menunjuk ke dan melihat isi konstan.
Dan ampersand adalah sama hal sebagai alamat.
>> Jadi jika saya memiliki variabel a-- seperti, mari kita mengatakan bahwa saya melakukan int a sama 3--
jika saya ingin mencari alamat yang variabel memori, saya hanya bisa melakukan
Ampersand a.
Jadi alamat.
Masuk akal?
>> Jadi, inilah contoh.
Ini hilang int b dan c int.
Jadi int a sama dengan 3 cara yang Aku akan pergi ke memori.
Dan aku akan menemukan slot dan memasukkan nomor 3 di sini.
>> Dan kemudian int b sama dengan 4.
Aku akan melakukan hal yang sama.
Ke memori dan menempatkan nomor 4 di salah satu kotak.
Dan int sama dengan 5.
Cari kotak lain dan mencantumkan nomor 5.
>> Jadi apa baris ini lakukan di luar? Bintang n pa sama dengan ampersand a.
Jadi pertama-tama, n bintang pa.
Apa itu lakukan?
>> AUDIENCE: [Tak terdengar].
>> LUCAS: Ya, jadi n bintang pa, pertama, mendeklarasikan pointer disebut pa.
Dan kemudian itu menempatkan nilai pointer yang menjadi alamat.
Jadi Ampersand a.
Lalu, jika saya melakukan star pb, apa itu pb bintang?
>> Oh, maaf.
Hal ini juga hilang. n pb bintang.
Maksudku Bintang pc.
Aku sangat menyesal.
Ini hal yang sama.
Tapi sekarang aku baik ar menciptakan pointer b dan kemudian pointer ke c.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> LUCAS: Ya.
Jadi, jika Anda pergi ke memori dan Anda pergi ke kotak yang penanda untuk pa,
Anda benar-benar akan melihat alamat.
OK?
Ya?
>> AUDIENCE: [Tak terdengar]?
>> LUCAS: Ya, pointer adalah alamat.
Jangan pernah lupa bahwa.
Ini seperti yang paling penting bagian tentang pointer.
Ada menyimpan dan alamat beberapa variabel.
Ada lagi?
Ada pertanyaan lain?
OK.
>> Jadi Pointer dan Array.
Ingatlah bahwa ketika saya melakukan int array yang 3, pada dasarnya, apa yang saya lakukan adalah saya, jenis
dari, menyatakan dalam pointer.
Jadi array jenis seperti pointer ke tempat tertentu di memori di mana saya
dialokasikan tiga slot untuk bilangan bulat.
Apakah itu masuk akal?
>> Jadi ketika saya melakukan array int 3, apa yang saya lakukan, pada dasarnya, adalah menciptakan tiga
slot memori.
Jadi saya hanya menemukan tiga slot memori.
Jadi jika saya lakukan, maka, array bintang, pada dasarnya berarti isi array,
yang berarti saya menghapus pointer, aku pergi ke tempat yang itu menunjuk ke,
dan saya menaruh nomor satu.
>> Dan kemudian, jika saya melakukan berbagai star plus 1, itu hal yang sama seperti melakukan berbagai
kurung satu, yang hanya berarti saya pergi ke tempat yang itu menunjuk.
Dan kemudian ditambah 1 merek saya menggeser satu posisi.
Jadi aku pergi ke posisi ini, sebenarnya, dan menempatkan nomor dua.
>> Dan kemudian, akhirnya, ketika saya lakukan Array ditambah 2, saya pergi ke mana
menunjuk array di.
Dan kemudian saya pindah ke blok memori.
Dan kemudian saya menempatkan nomor tiga di sini.
Ya?
>> AUDIENCE: array Jadi Bintang hanya mengatakan titik pertama.
Dan Anda dapat menambahkan 1, hanya karena kami hanya benar-benar
referensi alamat pertama.
>> LUCAS: Ya.
Mengapa kita, misalnya, mengatakan berbagai 0, deret 1, dan berbagai 2?
Saya katakan, kenapa kau lakukan 0, 1, 2, 3 bukannya 1, 2, 3?
Salah satu alasan adalah, satu, komputer programmer lebih memilih untuk memulai
menghitung dari 0.
Dua adalah karena ketika Anda melakukan berbagai 0, itu adalah hal yang sama seperti melakukan berbagai
ditambah 0, yang berarti saya pergi ke posisi itu, dan aku tidak
melewatkan setiap blok memori.
Jadi saya tidak memindahkan setiap blok memori.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> LUCAS: Jadi dia bertanya apa yang perbedaan antara melakukan
ini atau melakukan malloc.
Salah satu perbedaan adalah bahwa array int 3 adalah menciptakan
array di stack.
Dan ketika saya melakukan malloc, itu menciptakan di heap.
Apakah itu masuk akal?
>> Jadi bagaimana malloc benar-benar bekerja?
Jadi mengapa bahkan kita perlu menggunakan malloc?
Jenis compiler Anda tokoh semua variabel yang dideklarasikan.
Dan dia menciptakan ruang untuk semua dari mereka dalam stack.
Jadi semua variabel Anda akan berada di suatu tempat di tumpukan.
Jadi di sini adalah variabel lingkungan.
>> Jadi pada dasarnya, ruang untuk variabel dalam memori dialokasikan di
waktu kompilasi.
Jadi itu berarti bahwa komputer Anda memiliki untuk mengetahui semua variabel
sebelumnya.
Tidak perlu tahu apa nilai Anda akan dimasukkan ke dalam mereka.
Tapi perlu tahu bagaimana banyak memori yang Anda butuhkan.
>> Tapi sekarang mari kita mengatakan bahwa, misalnya, Anda membuat sebuah array atau mengambil
string yang Anda mengambil dari pengguna.
Anda tidak tahu berapa lama string akan menjadi, misalnya.
Jadi Anda tidak tahu persis berapa banyak blok memori Anda mengalokasikan, kan?
>> Jadi tidak benar-benar masuk akal untuk Anda mengatakan menempatkan 100 karakter.
Dan kemudian bagaimana jika pengguna menulis 150?
Kau akan menjadi kacau.
>> Jadi pada dasarnya, Anda tidak bisa yakin bagaimana banyak memori yang Anda butuhkan untuk mengalokasikan
ketika Anda mengkompilasi program.
Anda hanya tahu bahwa pada run time.
Jadi itulah mengapa Anda memiliki tumpukan.
Jadi tumpukan akan memiliki memori bahwa Anda mengalokasikan selama
durasi program berjalan.
>> Jadi pada dasarnya, ketika Anda melakukan malloc, apa Anda lakukan adalah mengalokasikan memori pada
runtime, yang berarti bahwa Anda memutuskan tepat pada saat itulah Anda
harus memiliki memori yang.
Jadi itulah ketika Anda mengalokasikan itu.
Apakah itu masuk akal?
>> Jadi ingat, stack memiliki variabel yang dibuat pada waktu kompilasi.
Dan kemudian tumpukan memiliki variabel yang dibuat saat Anda pergi
dengan malloc, misalnya.
>> AUDIENCE: [Tak terdengar]?
>> LUCAS: Jadi GetString adalah akan menelepon malloc.
Biarkan aku bicara tentang malloc, dan Aku akan menjelaskan GetString.
Jadi malloc adalah hal yang sama sebagai alokasi memori.
Jadi itu akan mengalokasikan memori di heap.
Dan itu akan kembali pointer ke dimana memori yang dialokasikan pada.
>> Jadi, ketika Anda do--
di sini untuk example--
n pointer bintang.
Dan kemudian pointer sama dengan malloc ukuran inci kali 10.
Aku menciptakan pointer.
Dan kemudian aku menugaskan bahwa pointer ke nilai pointer yang malloc
memberi saya.
>> Jadi aku bertanya malloc dapat Anda mengalokasikan ruang untuk 10 bilangan bulat.
Itulah yang itu mengatakan.
Dan malloc memberi saya kembali pointer ke tempat itu.
Masuk akal?
OK.
Aku Dan GetString adalah, pada dasarnya, melakukan panggilan untuk malloc sehingga Anda dapat mengalokasikan
memori saat runtime.
>> Selalu ingat untuk memeriksa null karena malloc akan kembali null
jika tidak dapat mengalokasikan memori.
Katakanlah bahwa Anda meminta konyol jumlah memori.
Komputer Anda tidak akan mampu mengalokasikan sebanyak itu.
>> Jadi malloc hanya akan untuk kembali null.
Jadi selalu ingat untuk memeriksa apakah pointer yang Anda dapatkan dari malloc adalah
nol atau tidak karena, jika demikian, Anda mungkin akan dereferencing pointer dan
menyebabkan kesalahan samping.
Dan akhirnya, jangan lupa memori Anda.
>> Malloc menciptakan memori di heap.
Dan Anda harus membebaskan memori sebelum program berakhir.
OK, itu saja bagi saya.
Maaf, Rob.
Terima kasih.
>> [Tepuk Tangan]
>> LUCAS: Pertanyaan terakhir sebelum Rob datang?
Tidak?
Ya?
>> AUDIENCE: Aku tidak melihat satu online ini.
Apakah Anda upload belum?
>> LUCAS: Saya pikir Dave adalah upload segera.
>> DAVE: Ini akan diposting.
>> LUCAS: Ini akan online.
>> AUDIENCE: Terserah.
>> LUCAS: Terserah?
OK.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> LUCAS: Ya, Anda harus membebaskan semua memori yang dimasukkan ke dalam tumpukan.
>> AUDIENCE: [Tak terdengar]?
>> LUCAS: Ya.
Setiap kali Anda memiliki malloc budaya, Anda harus memiliki budaya gratis
setelah Anda berhenti menggunakannya variabel tersebut.
Jadi malloc dan bebas selalu bersama.
Teman-teman terbaik mereka.
Ya.
Rob?
>> ROB: Aku akan pergi dengan cepat.
Dan juga video akan memasang.
Saya memiliki mic di.
>> OK, jadi minggu lima hal.
Hal pertama yang kami miliki adalah stack.
Jadi ingat bahwa hanya ada satu tumpukan bingkai per fungsi panggilan aktif.
Kita akan melihat bahwa dalam satu detik.
Dan juga ingat apa yang sebenarnya terjadi di setiap frame tumpukan akan menjadi
variabel lokal fungsi kami, argumen yang dilewatkan ke kami
fungsi, bersama dengan pasangan hal lain yang tidak benar-benar
perlu khawatir tentang.
>> Jadi, inilah contoh program di mana, pemberitahuan, utama printfing pengembalian
nilai foo 4.
foo hanya akan mengembalikan nilai bar 4 koma 6.
Dan bar akan mengatur beberapa lokal variabel n sama dengan 4 kali 6.
Dan kemudian kembali n.
>> Jadi mari kita lihat tumpukan seluruh iterasi sebenarnya program ini.
Jadi ada bagian bawah tumpukan kami.
Ingat bahwa tumpukan tumbuh.
Jadi pada bagian bawah tumpukan, kami memiliki kerangka stack untuk utama.
Ketika program dijalankan, utama selalu akan berada di
bawah tumpukan kami.
>> Dan apa yang ada dalam kita tumpukan bingkai untuk utama?
Jadi meskipun tidak ada lokal variabel untuk utama, seperti saya katakan sebelumnya,
kami telah argc dan rgv mengambil ruang dalam utama stack frame.
Jadi utama sekarang akan memanggil fungsi foo.
Dan itu berarti foo akan mendapatkan stack frame sendiri.
>> Jadi sekarang kita dalam fungsi foo.
Dan apa yang perlu masuk foo ini stack frame?
Nah, foo memiliki argumen n.
Dan n adalah sama dengan 4 karena itulah yang utama adalah melewati sebagai argumen foo ini.
>> Jadi sekarang foo akan menelepon bar.
Apa yang bar akan memiliki di dalam yang 'stack frame?
Memiliki x sama dengan 4 y sama dengan enam.
Itu tidak semua yang kita akan memiliki dalam stack frame karena bar
juga memiliki variabel n lokal.
Dan n kita akan ditetapkan sama dengan 24.
>> Jadi sekarang bar akan kembali n.
Jadi bar adalah kembali ke 24 foo stack frame.
Dan karena bar sekarang kembali, bahwa berarti kita sedang popping stack frame
untuk bar off dari tumpukan.
Jadi semua memori yang bar telah menggunakan sekarang dari tumpukan.
>> Sekarang, foo juga akan untuk kembali 24 sampai utama.
Jadi sekarang foo yang kembali, memori foo yang menggunakan dalam 'nya
stack frame juga hilang.
Dan sekarang, utama akan memanggil printf.
Jadi printf hanya fungsi lain.
Ketika kita sebut printf, itu akan menjadi lain stack frame untuk printf
fungsi panggilan.
>> Apa yang kita lewat printf?
Itulah apa yang akan pergi pada frame stack.
Setidaknya, kita melewati persen bahwa saya backslash n dan
argumen 24.
Ini mungkin memiliki lebih di dalamnya stack frame jika printf kebetulan menggunakan beberapa
variabel lokal.
Kita tidak tahu.
>> Tapi semua yang terjadi di dunia printf tumpukan bingkai.
Ini akan mengeksekusi printf.
Kemudian printf dilakukan.
Ini akan kembali.
Akhirnya, utama dilakukan.
Main akan kembali.
Dan kemudian program kami dilakukan.
Ya?
>> AUDIENCE: Apakah Anda melihat [Tak terdengar]
argumen [Tak terdengar]
parameter?
>> ROB: Jadi ada perbedaan yang halus antara argumen dan parameter.
Dan benar-benar, dalam berbicara umum, orang cenderung hanya campuran mereka sepanjang waktu.
Tapi parameter formal nama hal.
>> Jadi argc dan argv adalah parameter untuk utama.
Argumen adalah apa yang Anda benar-benar lulus sebagai parameter.
Jadi di sana ketika saya sebut foo dari 4, 4 adalah argumen saya lewat di.
Dan n parameter, dalam foo, mengambil nilai 4
sejak 4 adalah argumen.
>> AUDIENCE: [Tak terdengar]?
>> ROB: n adalah variabel lokal ke bar.
n masih lokal untuk foo, tetapi itu adalah parameter untuk foo.
Ini bukan variabel lokal.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: foo hanya menelepon bar dan kembali apapun bar kembali.
>> AUDIENCE: [Tak terdengar]?
>> ROB: Ya, hanya untuk melihat beberapa stack frames.
Ya?
>> AUDIENCE: Mengapa foo disebut sebelum printf?
>> ROB: Mengapa foo disebut sebelum printf?
Jadi saya bisa, sebaliknya, melakukan sesuatu seperti int x sama foo dari 4
dan kemudian dicetak x.
Tapi sebaliknya, saya menggabungkan fungsi panggilan ke argumen printf.
>> Tapi perhatikan bahwa kita tidak bisa benar-benar mengeksekusi panggilan ke printf sampai kita
mencari tahu apa foo dari 4 adalah.
Jadi kita akan mengevaluasi hal ini.
Dan hanya sekali itu selesai akan untuk kembali dan mengevaluasi ini.
Ya?
>> AUDIENCE: Karena kedua bar [Tak terdengar]
nilai, mengapa kita tidak memiliki [Tak terdengar]?
>> ROB: Mereka benar-benar harus int.
Itu tidak tertangkap lebih melewati beberapa.
Jadi harus int bar dan int foo karena kedua orang
akan kembali bilangan bulat.
Void hanya jika mereka tidak akan untuk kembali nilai-nilai yang sebenarnya.
Ya?
>> AUDIENCE: Jika Anda memiliki garis di atas kembali, [Tak terdengar]?
>> ROB: Sebuah baris di atas return?
>> AUDIENCE: Ya.
Seperti jika Anda melakukan printf dan [Tak terdengar], apakah itu mencetak dua kali?
>> ROB: Jadi dalam foo?
Jika kita memiliki printf hak di sini?
>> AUDIENCE: Ya.
>> ROB: Jadi jika kita memiliki hak printf di sini, itu akan mencetak sekali.
Karena kita panggil foo sekali tepat di sini, maka kita akan memukul printf.
Kemudian kita akan menelepon bar.
Dan kemudian foo akan kembali.
Dan itu saja.
Kami hanya pernah bertemu printf sekali.
Ya?
>> AUDIENCE: [Tak terdengar]
printf memanggil foo karena kita lebih dulu memanggil printf dan kemudian kita melewati
argumen.
>> ROB: Jadi dalam teori, tidak printf memanggil foo?
Jadi tidak ada.
Hanya agar c akan mengeksekusi hal-hal ini adalah, sebelum kita bisa
memanggil fungsi, semua argumen ke fungsi harus
sepenuhnya dievaluasi.
Jadi apakah ini benar-benar dievaluasi?
Ya, itu hanya string.
Hanya saja nilai.
>> Kemudian kita harus benar-benar mengevaluasi ini.
Setelah ini dilakukan, sekarang semua argumen dievaluasi.
Dan sekarang kita dapat membuat panggilan ke printf.
Ya?
>> AUDIENCE: Satu pertanyaan.
Jika Anda memiliki fungsi void, harus Anda memiliki kembali koma?
>> ROB: Anda tidak melakukan koma pulang jika Anda memiliki fungsi void.
OK.
Jadi sekarang beberapa hal tumpukan.
Jadi tumpukan adalah bagaimana kita akan menangani dengan manajemen memori dinamis.
Dan ini langsung kontras dengan tumpukan yang kita sebut otomatis
manajemen memori.
>> Jadi di stack, Anda tidak pernah benar-benar memiliki untuk berurusan dengan bagaimana variabel lokal
sedang mendorong dan muncul dari semua frame tumpukan ini dan semua itu.
Anda tidak perlu khawatir tentang hal itu.
Ini otomatis.
Jadi tumpukan adalah manual.
Dan [Tak terdengar]
berasal dari fungsi-fungsi ini malloc dan bebas.
>> Jadi, inilah program lain.
Semua yang kita lakukan adalah mallocing integer.
Kami menyimpannya dalam bintang x.
Tentu saja, kita harus memeriksa untuk melihat apakah x adalah null.
Kemudian kita akan hanya menetapkan apa yang x menunjuk ke 50.
Cetak apa x menunjuk ke, print x, dan kemudian bebas x.
>> Jadi bagaimana ini benar-benar akan melihat jika kita melihat tumpukan dan tumpukan kami?
Jadi kita akan mulai lagi.
Bagian bawah tumpukan kami seperti sebelumnya.
Ingat bahwa engkau menimbun langsung menentang stack?
Jadi kita akan memiliki atas tumpukan kami di sana.
>> Jadi bagian bawah tumpukan kami, kami memiliki kami stack frame untuk utama.
Ini memiliki ruang untuk argc, argv, dan kami sekarang memiliki variabel x lokal, yang
adalah bintang int.
Jadi kita akan iterate melalui program ini.
Hal pertama yang kami miliki adalah panggilan untuk malloc.
>> Jadi kita membuat panggilan ke malloc.
Malloc adalah fungsi.
Ini akan mendapatkan stack frame.
Apa yang kita lewat untuk malloc?
Itu akan masuk ke dalam dari stack frame.
Kami melewati ukuran n, yaitu 4.
Sehingga akan diteruskan ke malloc.
>> Apa malloc lakukan?
Ini meraih kita beberapa ruang di heap.
Jadi kita akan pergi ke tumpukan.
Dan kita akan ambil 4 byte dari tumpukan.
Jadi mari kita hanya memberikan bahwa alamat sewenang-wenang.
0x123 Hanya berpura-pura bahwa adalah alamat yang ada di heap.
>> Jadi apa sebenarnya di dalam itu daerah memori di alamat Ox123?
Sampah.
Jadi kita belum menyimpan apa-apa di dalamnya.
Jadi sejauh yang kami tahu, bisa apa saja.
Anda tidak harus menganggap itu nol.
Ini kemungkinan besar tidak nol.
>> Jadi sekarang kembali malloc.
Dan apa yang kita lakukan ketika malloc kembali?
Kami menetapkan apa kembali.
Kami menetapkan x sama dengan apa itu kembali.
Jadi apa itu kembali?
Ini kembali 0x123 karena itu adalah alamat blok memori yang
hanya dialokasikan di heap.
>> Jadi kembali 0x123 x sekarang akan diatur sebesar 0x123 yang, pictorially,
kita sering menarik sebagai x memiliki sebenarnya panah menunjuk ke blok itu.
Tapi x hanya menyimpan alamat tersebut.
Jadi sekarang kita harus memeriksa apakah x adalah null.
Ini bukan null.
Kami berpura-pura bahwa malloc yang berhasil.
>> Jadi sekarang star x sama dengan 50.
Jadi Bintang ingat itu berarti pergi ke alamat tersebut.
Jadi 0x123 Kita akan pergi ke alamat tersebut.
Jadi yang membawa kami di sana.
Apa yang kita lakukan di alamat itu?
Kami menyimpan 50.
>> Jadi setelah baris ini, itulah yang hal-hal yang akan terlihat seperti.
Jadi sekarang itu tidak lagi sampah di sana.
Sekarang kita tahu bahwa 50 adalah dalam alamat tertentu karena
kita set itu.
OK?
Jadi sekarang kita akan mencetak f.
>> Jadi pertama kita akan mencetak bintang x.
Jadi apa adalah bintang x?
Sekali lagi, bintang x berarti pergi ke hal yang x menunjuk ke.
Jadi x adalah menyimpan 0x123 Pergi ke itu.
Kami mendapatkan 50.
Jadi mencetak f itu.
Dan itu berarti itu akan mencetak 50.
Dan kemudian yang mengembalikan.
>> Dan kemudian kita memiliki printf kedua.
Kami sekarang persen p.
Jika Anda belum melihatnya, itu hanya bagaimana Anda mencetak pointer.
Jadi kita memiliki persen i, persen f, dan semua orang sudah.
Jadi persen p, mencetak pointer.
>> Jadi x adalah pointer.
Jadi, jika kita akan mencetak x sendiri, kami mencetak apa yang sebenarnya dalam
x, yang merupakan 0x123 Jadi yang pertama cetak f akan mencetak 50.
Cetak kedua f akan untuk mencetak 0x123 Ya?
>> AUDIENCE: Apakah anda menggunakan persen x untuk mencetak pointer?
>> ROB: Jadi yang Anda gunakan persen x untuk mencetak pointer?
Jadi Anda dapat tetapi persen x hanya, umumnya, untuk seperti jika Anda memiliki beberapa
integer dan Anda ingin mencetak sebagai heksadesimal a.
Itu hanya bagaimana Anda melakukannya.
>> Padahal, persen d akan dicetak sebagai desimal.
Itu sedang kita mendapatkan persen d. i hanya integer.
persen p secara khusus untuk pointer.
>> Jadi x adalah pointer.
Kami ingin menggunakan persen p.
Tapi persen x bisa bekerja.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Ya.
Setidaknya untuk ini call-- jadi saya tidak termasuk dalam sini.
Tapi dua argumen ini tentu dalam tumpukan ini bingkai
bersama dengan variabel lokal printf terjadi akan menggunakan.
Dan kemudian panggilan berikutnya ke printf sekarang dalam printf stack frame adalah
persen p backslash n dan apapun nilai x adalah, yang merupakan 0x123.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Ini akan mencetak sesuatu yang terlihat seperti ini.
>> AUDIENCE: [Tak terdengar].
>> ROB: Jadi mencetaknya dalam bentuk alamat.
Sepertinya alamat.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Mengapa apa?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Mengapa pointer ini 4 byte?
Jadi ada sekelompok keseluruhan 0 di depan ini.
Jadi itu benar-benar 0x0000000123.
Pada sistem 64-bit, akan ada sejumlah besar angka nol.
Ya?
>> AUDIENCE: [Tak terdengar].
>> ROB: Jadi printf pertama akan print--
>> AUDIENCE: [Tak terdengar].
>> ROB: Ya, itu akan mencetak apa x menunjuk ke.
Bintang mengatakan apa ini hal yang menunjuk ke.
Ambil itu.
Jadi apa itu menunjuk ke?
50.
Ambil itu.
Itulah yang akan kita cetak.
Sedangkan, yang berikutnya, kami hanya mencetak x itu sendiri.
Apa yang ada dalam f?
0x123.
OK.
>> Dan kemudian, akhirnya, kita memiliki gratis.
Apa yang kita lewat untuk membebaskan?
Kami melewati x.
Waktu itu aku benar-benar ditampilkan dalam stack frame.
>> Jadi kita melewati nilai 0x123 untuk membebaskan.
Jadi sekarang bebas tahu, baik-baik saja, Aku harus pergi ke tumpukan
dan bebas memori itu.
Ini tidak lagi menggunakan apa di alamat 0x123.
>> Begitu bebas akan merilis bahwa dari tumpukan.
Sekarang tumpukan kita kosong lagi.
Kami tidak memiliki kebocoran memori.
Sekarang bebas akan kembali.
Perhatikan bahwa x masih 0x123.
Tapi yang sekarang tidak memori valid.
Kita harus tidak lagi dereference x.
Ya?
>> AUDIENCE: Apakah return 0 berlebihan?
>> ROB: Apakah returen 0 berlebihan?
Ya.
Kami hanya menempatkan bahwa di sana karena kami memiliki kembali satu untuk udara.
Jadi itu seperti, ya, mari termasuk return 0.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Jadi setelah x bebas, apa yang terjadi jika kami mencoba untuk dereference pointer?
Ada kemungkinan bahwa tidak ada yang salah.
Ada kemungkinan bahwa kita masih akan mendapatkan 50.
>> Itu mungkin, juga, bahwa memori yang sekarang digunakan untuk sesuatu yang lain.
Jadi perilaku tidak terdefinisi.
Dan terdefinisi berarti apa-apa bisa terjadi.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Tidak, jadi jika Anda menetapkan x ke sesuatu yang lain.
Jadi jika di sini kita mengatakan x sama sesuatu malloc else--
malloc ukuran event--
maka blok asli memori tidak dibebaskan.
Dan kami telah resmi kehilangan itu.
Itu adalah kebocoran memori.
Kami telah kehilangan semua referensi itu blok memori.
Jadi tidak ada cara kita bisa pernah membebaskannya.
OK, jadi kemudian kembali 0 berarti dilakukan.
>> Baiklah, jadi stack overflow.
Apa ide di sini?
Jadi ingat, tumpukan akan turun.
Stack akan naik.
Jadi ini adalah contoh dari kuliah, Saya pikir, di mana utama hanya akan
memanggil fungsi foo ini, yang akan menyebut dirinya rekursif atas dan
lagi.
>> Jadi stack frames akan bekerja persis sama.
Jadi kita akan mulai dengan main sebagai dasar stack frame.
Kemudian utama akan memanggil foo, yang akan mendapatkan stack frame.
>> Kemudian foo akan menelepon foo lagi, yang akan mendapatkan
lain stack frame.
Dan sekali lagi, dan lagi, dan lagi, dan lagi sampai, akhirnya, kita jalankan
ke dalam tumpukan.
Jadi ini adalah bagaimana kita mendapatkan stack overflow.
Dan pada titik ini, Anda Seg kesalahan.
Atau Anda benar-benar seg kesalahan sebelum hal ini tapi ya.
>> AUDIENCE: Apakah inti dump sama seperti seg kesalahan?
>> ROB: Jadi Anda akan melihat segmentasi inti kesalahan dibuang.
Anda mendapatkan core dump ketika Anda seg kesalahan.
Dan itu seperti dump semua isi memori Anda saat ini sehingga
Anda dapat mencoba dan mengidentifikasi mengapa Anda seg menyalahkan.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Jadi segmentasi kesalahan berarti ada stack overflow.
Jadi belum tentu.
Sebuah kesalahan segmentasi berarti bahwa Anda memori menyentuh dengan cara
Anda tidak seharusnya.
Jadi salah satu cara yang terjadi adalah, ketika Anda tumpukan overflow, kita mulai menyentuh
memori dengan cara yang kita tidak boleh.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Jadi dalam loop tak terbatas.
Seperti, ini seperti tak terbatas rekursif lingkaran dan jadi kami mendapatkan lain
tumpukan bingkai setiap kali.
Tapi dalam biasa tak terbatas sementara satu--
baik, mari kita bahkan tidak mencetak f--
melakukan sesuatu.
Apapun.
>> Kami tidak akan mendapatkan lain stack frame.
Kami hanya akan terus looping lebih instruksi tunggal ini.
Tumpukan tidak tumbuh.
Ini adalah fakta bahwa setiap rekursif panggilan memberikan kita stack frame.
Itu sebabnya kita mendapatkan stack overflow.
Ya?
>> AUDIENCE: Jadi jika Anda mengatakan untuk mendapatkan while dan kemudian [Tak terdengar]?
>> ROB: Jadi jika dalam loop sementara ada printf, Anda masih akan
kesalahan tidak seg.
Aku hanya tidak ingin membingungkan hal.
Ini akan loop.
Anda akan mendapatkan satu tumpukan bingkai untuk printf.
>> Kemudian printf akan kembali.
Kemudian Anda sebaiknya lingkaran lagi.
Anda akan mendapatkan satu tumpukan bingkai untuk printf.
Ini akan kembali.
Tunggal stack frame.
Jadi Anda tidak mendapatkan ini tak terbatas menumpuk tumpukan frame.
>> AUDIENCE: [Tak terdengar]?
>> ROB: Ya.
Jadi tumpukan ini melimpah terjadi karena tidak ada yang
panggilan ke foo akan kembali.
Jadi jika kita kembali, maka kita akan mulai kehilangan tumpukan frame.
Dan kemudian kita tidak akan menumpuk overflow.
Dan itulah mengapa Anda membutuhkan kasus dasar untuk fungsi-fungsi pribadi Anda.
Ya?
>> AUDIENCE: Apakah ukuran potensi dan stack untuk tumpukan yang sama untuk
semua program?
>> ROB: Kira-kira.
Apakah ukuran potensi stack dan tumpukan yang sama untuk semua program?
Kira-kira.
Ada beberapa pengacakan di mana tumpukan dimulai dan
di mana tumpukan dimulai.
Jika Anda kebetulan memiliki seluruh banyak variabel global dan hal-hal, Anda mungkin
mengambil dari beberapa ruang untuk tumpukan Anda.
>> Pada sistem 64-bit, Anda hampir memiliki memori yang tak terbatas.
Ada begitu banyak.
Antara 32 bit dan 64 bit, yang perbedaan yang signifikan.
>> Anda akan mendapatkan lebih banyak lagi stack dan ruang tumpukan pada 64-bit
sistem karena ada hanya lebih alamat yang dapat mereka gunakan.
Tapi pada sistem individual, maka akan kira-kira jumlah yang sama tumpukan
dan ruang tumpukan.
Baiklah.
>> Jadi hal terakhir adalah kompilasi.
Jadi, Anda harus tahu proses ini.
Ada empat langkah besar.
Jadi yang pertama harus mudah diingat.
Pre-processing.
Ini memiliki awalan pra di dalamnya.
Jadi datang sebelum segala sesuatu yang lain.
>> Hal yang perlu diingat adalah hash.
Jadi hash mendefinisikan dan hash termasuk di semua orang.
Mereka adalah semua pra-prosesor arahan.
Ini adalah hal-hal yang pra-prosesor mengurus.
>> Jadi apa pra-prosesor lakukan?
Ini adalah hal yang benar-benar bodoh.
Semua itu mampu semua ini menyalin, dan cut, dan pasta operasi.
>> Jadi hash mencakup standar I0 dot h.
Apa itu lakukan?
Ini meraih standar I0 dot h mengajukan dan paste ke atas
dimanapun ia mengatakan hash termasuk standar I0 dot h.
>> Dan hash apapun mendefinisikan bahwa kita sudah dilihat, apa yang itu lakukan?
Its menyalin nilai yang hash didefinisikan didefinisikan sebagai dan paste yang
dimanapun Anda menggunakan nilai.
Jadi preprocessor hanya melakukan benar-benar operasi berbasis teks sederhana.
Itu tidak apa-apa pintar.
Jadi segala sesuatu yang lain lebih rumit.
>> Jadi sekarang preprocessor yang dilakukan, kita benar-benar kompilasi.
Jadi apa kompilasi artinya?
Kami sekarang pergi dari kode c kode assembly.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Ya, kami menangkap itu.
Jadi kompilasi.
Kita pergi dari c ke assembly.
Jadi ini adalah perubahan bahasa yang sebenarnya.
Kompilasi sendiri berarti pergi dari bahasa tingkat tinggi ke
bahasa tingkat yang lebih rendah.
>> Dan c adalah bahasa tingkat tinggi dibandingkan dengan assembly.
Apa itu perakitan?
Instruksi yang, cukup banyak, dibuat untuk CPU Anda.
Tapi komputer Anda masih tidak tidak mengerti perakitan.
Ini hanya mengerti satu dan nol.
Jadi langkah selanjutnya adalah perakitan, yang membawa kita dari petunjuk ini yang
CPU Anda mengerti dan benar-benar menerjemahkannya, untuk
satu dan nol.
>> Jadi C ke assembly ke biner.
Tapi aku tidak memiliki executable belum.
Jadi pikirkan perpustakaan CS50.
Kami telah menyediakan Anda dengan biner untuk perpustakaan CS50 ini, yang memiliki GetString
dan getInt dan semua itu.
>> Tapi CS50 library--
dalam dan dari itself-- tidak dieksekusi.
Itu tidak memiliki fungsi utama.
Ini hanya sekelompok biner yang dapat Anda gunakan.
Jadi menghubungkan adalah bagaimana kita menyatukan semua dari file-file biner yang berbeda
menjadi executable yang sebenarnya.
Salah satu yang Anda dapat mengetik dot slash titik keluar.
>> Jadi ini seperti file yang Anda menulis, - apa pun program yang Anda Ini--
Ceaser dot c.
Tapi sekarang sudah dikompilasi ke biner.
Jadi Ceaser dot o.
Dan ini adalah CS50 kami perpustakaan biner.
Dan mereka sedang dikombinasikan menjadi executable tunggal.
Ya?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Jadi pertama meliputi, ingat, hash termasuk sebenarnya
pra-prosesor langkah.
Tapi itu terpisah.
Jika Anda tidak menggunakan fungsi apapun yang berada di luar file tunggal Anda maka,
tidak, Anda tidak perlu menghubungkan apa-apa karena Anda memiliki segalanya.
>> Yang mengatakan, printf sedang terhubung dalam.
Jika Anda pernah menggunakan printf, itu sesuatu yang perlu terhubung dalam
karena Anda tidak menulis itu.
Dan, pada kenyataannya, printf secara otomatis terhubung dalam.
Kau tahu bagaimana di baris perintah atau ketika Anda ketik membuat, Anda melihatnya memiliki
dasbor l CS50, yang memiliki tautan di perpustakaan CS50?
Printf, dan hal-hal seperti itu, akan untuk dihubungkan secara otomatis.
Ada pertanyaan lain pada sesuatu?
>> AUDIENCE: [Tak terdengar]?
>> ROB: Menghubungkan?
Kami memiliki sejumlah besar file biner yang berbeda.
Ini adalah contoh kanonik yang kita gunakan adalah perpustakaan CS50.
Kami telah mengumpulkan dan diberikan kepada Anda biner untuk perpustakaan CS50 ini.
>> Anda ingin menggunakan GetString dalam program Anda.
Jadi Anda pergi dan menggunakan GetString.
Tapi tanpa kode biner saya untuk GetString, ketika Anda mengkompilasi kode Anda
bawah, Anda tidak dapat benar-benar menjalankan Anda Program karena GetString String adalah
belum sepenuhnya ditentukan.
>> Hanya ketika Anda link dalam biner saya yang berisi GetString yang sekarang, semua
benar, aku benar-benar bisa mengeksekusi GetString.
File saya selesai.
Dan aku bisa menjalankan ini.
Ya?
>> AUDIENCE: Apakah menyambungkan mengkonversi biner untuk dieksekusi?
Jadi bahkan jika Anda tidak memiliki lain perpustakaan, bukankah masih
diperlukan untuk menerjemahkan tombol [Tak terdengar]?
>> ROB: Jadi dieksekusi masih dalam biner.
Ini hanya menggabungkan keseluruhan sekelompok binari.
>> AUDIENCE: Terima kasih banyak.
>> ROB: Tidak ada masalah.
Ada pertanyaan lain?
Jika tidak, kita sudah siap.
Baiklah.
Terima kasih.
>> [Tepuk Tangan]
>> AUDIENCE: Terima kasih.
>> ROB: Ya.