[MUSIC PLAYING] Doug LLOYD: Baiklah. Jenis topik yang aneh, kan? Angka ajaib. Apa doe dia maksud ketika dia berbicara tentang angka ajaib? Nah, beberapa program bahwa kita telah ditulis dalam CS50 sejauh ini memiliki beberapa aneh nomor jenis dilemparkan mereka. Mungkin karena alasan kita tidak sepenuhnya memahami sekarang. Misalnya, dalam masalah Mario, kami capped ketinggian piramida di 23. Kami secara eksplisit mengatakan Anda tidak bisa lebih tinggi dari 23. Tapi apa artinya 23? Nah, jika Anda membaca spek hati-hati, Anda mungkin telah melihat bahwa Alasan kami capped itu pada 23 adalah karena ketinggian standar dari jendela terminal adalah 24. Dan jadi jika kita memiliki piramida lebih tinggi dari itu, mungkin melakukan hal yang aneh ini di mana ia berjalan dari layar. Dan kau tahu, apa itu berarti dalam konteks, kan? Apakah arti dari 23 segera jelas untuk seseorang yang melihat program Anda dan mungkin memiliki berbeda Ukuran terminal window? Mungkin tidak. Sepertinya, OK. Nah, mengapa hanya kurang dari 23? Secara umum, itu semacam dari kebiasaan buruk sebenarnya menulis konstanta ke dalam kode Anda. Dengan demikian, ketika Anda benar-benar melakukan menulis konstan ke dalam kode Anda, itu kadang-kadang disebut sebagai menggunakan nomor ajaib, yang merupakan sesuatu kita biasanya ingin mencoba dan menghindari. Sebagai contoh, mari kita lihat di fungsi sederhana ini di sini. Jelas ada data ketik C disebut kartu atau dek. Jadi hanya beruang dengan saya. Ini sedikit pseudocode dicampur dalam sini. Ini adalah fungsi yang disebut berurusan kartu yang tampaknya mengambil dek sebagai parameter, dan akan menampilkan kepada saya satu kartu. Dan aku melakukan sesuatu di sini di mana saya memiliki loop yang berjalan 0-52, dan saya menangani kartu. Nah, kita punya sihir nomor di sini, benar. Apakah Anda melihat apa angka ajaib adalah? Atau lebih penting, apakah Anda melihat apa masalahnya di sini? Terutama jika ini adalah salah satu fungsi di file sendiri dalam folder yang berisi sekelompok berbeda file, yang masing-masing melakukan hal lain untuk setumpuk kartu. Mungkin mengocok mereka, atau Penawaran tangan dari lima kartu bukan kartu tunggal. Apakah Anda melihat apa yang masalah bisa berada di sini? Apakah Anda melihat angka ajaib Aku sudah disuntikkan ke dalam kode? Ini 52, benar. Seperti, intuitif Anda mungkin tahu, OK. Seperti setumpuk standar kartu berisi 52 kartu. Namun dalam program kami, itu hanya jenis yang beredar di sana. Ini seperti tiba-tiba ada 52. Salah satu cara untuk mengatasi ini Masalahnya adalah untuk melakukan hal ini. Kami sangat eksplisit sekarang memanggil ukuran dek 52. Ini memberikan sedikit lebih intuitif artinya ketika di untuk loop nanti kita katakan, saya kurang dari ukuran deck. Sepertinya lebih baik daripada mengatakan 52. Sekarang ini tidak benar-benar memperbaiki masalah. Ini memberikan beberapa simbolik berarti konstan. Tapi itu jenis sebenarnya memperkenalkan masalah lain yang mungkin tidak segera jelas. Bahkan jika variabel ini dinyatakan globally-- Anda ingat apa yang berarti ketika kita mendeklarasikan variabel global dibandingkan lokal? Bahkan jika kita mendeklarasikan variabel global, bagaimana jika ada fungsi lain di suite kami fungsi yang berhubungan dengan manipulasi kartu yang secara tidak sengaja mengubah ukuran dek, atau meningkatkan dengan 1 atau menurun dengan 1. Itu bisa menyebabkan masalah, kan? Apalagi jika kita sedang berhadapan dengan satu set kartu mana mengocok dek penuh Dibutuhkan. Jika ukuran deck menurun oleh 1, misalnya, untuk 51, kita tidak benar-benar mengocok semua kartu mungkin. Kami meninggalkan salah satu dari mereka keluar. Dan nilai yang mungkin bisa diprediksi atau dimanfaatkan oleh aktor yang buruk. C memberikan apa yang disebut preprocessor direktif, yang juga disebut makro untuk menciptakan konstanta simbolik. Dan pada kenyataannya, Anda sudah sudah melihat direktif preprocessor, bahkan jika Anda belum pernah mendengar hal itu disebut bahwa dengan #include. Ini contoh lain dari makro atau preprocessor direktif. Cara untuk membuat konstanta simbolik, atau memberikan nama untuk sebuah konstanta sehingga memiliki lebih yang berarti, adalah sebagai berikut. #define, nama, pengganti. Benar-benar penting selain di sini benar-benar cepat. Jangan menaruh titik koma di akhir # mendefinisikan Anda. Jadi itu define, nama, pengganti. Ketika program Anda dikompilasi, apa yang sebenarnya terjadi adalah compiler jika akan untuk pergi melalui kode Anda dan mengganti setiap contoh kata "nama" dengan apa pun yang Anda ditempatkan sebagai pengganti. Analog, jika #include adalah semacam dari mirip dengan copy dan paste, maka #define adalah semacam mirip dengan mencari dan mengganti, jika Anda pernah menggunakan fitur yang di program pengolah kata, misalnya. Jadi misalnya, jika saya # define pi sebagai 3.14159265, jika Anda lebih matematis miring dan Anda tiba-tiba melihat 3.14159265 terbang di dalam kode Anda, Anda mungkin tahu itu berbicara tentang pi. Tapi mungkin kita dapat memberikan sedikit makna yang lebih simbolis. Dan kita justru bisa mengatakan #define pi sebagai yang seteguk nomor bahwa aku tidak akan terus membaca berulang-ulang. Dan apa yang akan terjadi kemudian di waktu kompilasi adalah ketika program ini adalah disusun, hal pertama yang akan terjadi itu akan melalui dan itu akan menggantikan setiap kali itu melihat P modal, modal saya, itu akan benar-benar menggantinya dengan 3.14 dan seterusnya, sehingga Anda tidak perlu mengetik setiap waktu saat program Anda masih memiliki fungsi yang Anda harapkan, karena Anda bekerja dengan memanipulasi, mengalikan, membagi, apa pun itu adalah dengan pi. Anda tidak terbatas pada ini substitusi untuk angka saja. Sebagai contoh, saya bisa # define Tentu saja sebagai string CS50. Dalam hal ini, ketika Program dikompilasi, #define akan pergi melalui kode, ganti setiap kali ia melihat "Tentu saja" dengan string CS50. Anda akan melihat di sini juga yang sering saya #define semua saya didefinisikan simbolik konstanta, sehingga untuk berbicara, selalu dalam semua topi. Ini konvensi. Itu tidak diperlukan. Alasannya umumnya orang akan menggunakan semua ibukota ketika mereka #defining hanya untuk membuatnya benar-benar jelas bahwa elemen tertentu dari kode saya adalah konstanta didefinisikan. Jika itu huruf kecil, itu mungkin bahwa mungkin bingung dengan variabel. Dan itu mungkin bukan hal yang baik untuk dilakukan. Jadi ini khususnya solusi jauh lebih baik daripada salah satu dari yang sebelumnya. Jika saya #define pertama ukuran dek 52, maka sekarang saya gunakan 52, atau ukuran malas, jauh lebih intuitif dan jauh lebih aman. Anda tidak dapat memanipulasi konstan. Anda tidak bisa mengatakan 52 plus plus. Itu tidak akan mengubahnya menjadi 53. Anda tidak dapat mengubah 52 untuk sesuatu. Anda dapat mengubah variabel yang nilainya 52, yang merupakan fix pertama kami miliki sebelumnya. Dan Anda dapat meningkatkan bahwa variabel ke 53. Tapi Anda tidak bisa mengatakan 52 plus plus dan memiliki yang tiba-tiba berubah menjadi 52 53. 52 selalu 52. Dan sehingga Anda tidak dapat secara tidak sengaja mengubah Ukuran malas dengan memanipulasi itu, Sisi lain baik Pengaruh meskipun ini adalah yang Anda menyadari bahwa tidak semua negara di seluruh dunia menggunakan setumpuk kartu ukuran 52? Sebagai contoh, itu benar-benar umum di Jerman menggunakan ukuran dek dari 32, di mana mereka menghapus beberapa dari bawah kartu nilai. Dan dalam hal ini, saya ingin pelabuhan suite saya fungsi yang berhubungan dengan kartu manipulasi ke Jerman. Aku bisa di contoh pertama kami menunjukkan, harus pergi dan mengganti semua contoh 52 dalam kode saya dengan 32. Tapi di sini, jika saya # define ukuran dek 32 di bagian paling atas dari kode saya, jika saya harus mengubahnya, saya bisa hanya pergi dan mengubah itu satu hal. Mengkompilasi ulang kode saya, dan semua tiba-tiba itu menyebar melalui. Bahkan, kita dapat mengubah dek ukuran nilai apapun yang kita inginkan. Dapatkah saya menarik minat Anda dalam permainan ukuran dek pikap? Aku Doug Lloyd. Dan ini CS50.