>> [音樂播放]
DOUG LLOYD：好吧。
有種奇怪的話題，對吧？
幻數。
什麼母鹿他的意思時，他的 談到幻數？
嗯，有些節目 我們已經寫在CS50
到目前為止，已經有一些怪異 樣的數字扔在他們。
也許對於原因，我們不 完全理解現在。
例如，在馬里奧問題，我們 皚皚的金字塔的高度在23。
我們明確地說你 不能去高於23。
>> 但什麼是23是什麼意思？
好吧，如果你讀了 仔細SPEC，你
可能已經看到， 因此，我們就封頂在23
是因為標準高度 終端窗口是24。
所以，如果我們有 金字塔比這更高，
它可能會做這種怪異的事情 它跑出畫面。
你知道有哪些呢 這意味著在上下文中，對不對？
>> 是23顯而易見的含義 以人誰看你的程序
也許有不同的 尺寸終端窗口？
很可能不會。
這似乎是，確定。
那麼，為什麼它僅僅不到23？
在一般情況下，它是一種 實際上是一個壞習慣
寫常量到你的代碼。
這樣，當你真正做 寫一個常數到你的代碼，
它有時也被稱為用 幻數，這是一件好事
我們一般要盡量避免。
>> 例如，讓我們一起來看看 在這個簡單的功能在這裡。
顯然沒有數據 用C型稱為卡或甲板。
所以只要多多包涵。
這是一點點 偽混在這裡。
這是一個被調用的函數 處理卡，顯然
取甲板作為它的參數，和 將輸出給我一張卡。
>> 而我做的東西在這裡，我 有運行從0到52的循環，
而我處理一張卡。
好了，我們已經有了一個魔法 在這裡數量，正確的。
你看到了什麼神奇的數字是？
或者更重要的是，你 看到的問題是什麼嗎？
特別是如果這 只是其中的一個功能
在一個它自己的文件 包含文件夾
一堆不同 文件，其每一個
做另一件事，以一副撲克牌。
也許它打亂他們，或涉及手 五張牌，而不是一個單一的卡。
>> 你看到什麼 問題可能是在這裡嗎？
你看到一個神奇的數字 我已經注入的代碼？
這是52吧。
>> 象，直觀的，你可能知道，OK。
就像一個標準的平台 卡中含有52卡。
但是，在我們的程序，它只是 一種漂浮在那裡。
這就像突然有一個52。
>> 解決方法之一 問題是要做到這一點。
我們很明確，現在 呼叫甲板大小為52。
它給了它一個更直觀一點 這意味著在for循環時，
稍後我們，然後說，我 小於甲板大小。
這似乎只是不是說52好。
現在，這並不實際解決問題。
它確實給一些象徵 意到恆定。
但它確實居然有種 引入另一個問題
這可能不會立即顯現出來。
即使這個可變 聲明globally--
你還記得是什麼 意味著當我們聲明
全球範圍內對局部變量？
即使我們聲明一個變量 全球範圍內，如果有什麼
在另一個函數 我們的套件功能
該處理卡操作 無意中改變甲板的尺寸，
或者通過增加它 1或減1的。
這可能會帶來麻煩，對吧？
特別是當我們正在處理一組 卡在那裡洗牌滿甲板
是必需的。
如果甲板尺寸減小 由1中，例如，至51
我們沒有真正洗牌 所有的卡可能。
我們留給他們的一出。
而該值或許是 預測或不好的演員利用。
>> C提供了什麼叫做 預處理指令，其中
也被稱為一個宏 創建符號常量。
而事實上，你已把 看到一個預處理指令，
即使你還沒有聽說過它 所謂在以#include。
這是一個宏觀的另一個例子 或預處理指令。
>> 該方法來創建符號常量， 或至一個恆定給出名稱
使之具有更 這意味著，如下。
＃定義，名稱更換。
拋開真的很重要 這裡真快。
不要把一個分號 您＃定義的末端。
所以這是＃定義，名稱，更換。
>> 當你的程序編譯， 實際發生的事情
是編譯器，如果打算 要通過您的代碼
更換的每個實例 單詞“名稱”不管你
把作為替代。
類似地，如果是＃包括排序 類似於複製和粘貼，
那麼＃定義是有點 類似於查找和替換，
如果你曾經使用過該功能的 文字處理程序，例如。
>> 因此，舉例來說，如果我 ＃定義PI為3.14159265，
如果你有更好的數學 傾斜你突然
看到3.14159265飛行 圍繞在你的代碼，
你可能知道它在談論圓周率。
但也許我們可以給它一個 多一點象徵意義。
我們可以改為說的#define 作為圓周率的數字是一口
我不是要保持 讀了個遍。
>> 什麼事情發生，然後在 編譯的時候是當程序
編譯後，第一件事就是 會發生的是它會經過
它將取代每次 它認為資本磷，資金我，
它會用它的字面取代 3.14等等，讓你
不必鍵入它的每一個 時間，而你仍然程序
具有的功能，你 期待，因為你的工作
與操縱，乘， 分割，不管它是圓周率。
>> 你並不限於此 替代只有數字。
例如，我可以＃定義 當然，作為字符串CS50。
在這種情況下，當 編譯程序，
＃定義將通過 代碼，替換每次
它認為“課程”的字符串CS50。
>> 你會發現在這裡 也是我經常
＃定義我的所有定義的符號 常量，可以這麼說，
總是全部大寫。
這是一個慣例。
它不是必需的。
究其原因一般人會用 當他們#defining全部大寫
只是，使其真正清楚， 我的代碼這個特定元素
是一個定義的常量。
如果是小寫的，它可能是 它可能被混淆的變量。
而這可能 不是一個很好的事情。
>> 因此，這個特殊的 溶液好得多
比任何以往的。
如果我第一次的#define甲板尺寸52，然後 現在我使用的52，或甲板的大小在這裡，
很多更直觀，安全很多。
你不能操縱一個常數。
你不能說52加再加。
這是不會將其轉換為53。
你不能改變52的東西。
>> 你可以改變一個變量 它的值是52，
這是我們收到的第一個補丁。
你可能會增加 該變量為53。
但你不能說52加上加號和 有搖身變成52 53。
52永遠是52。
所以你不能在不經意間改變 甲板尺寸在這裡通過操縱它，
>> 另一個好的一面 這雖然效果是
這是你知道不 全世界所有國家
使用的大小52一副撲克牌？
例如，它在真正的共同 德國使用的32甲板的尺寸，
他們剝離了一些 的較低值卡。
在這種情況下，我 希望我的口套房
那處理功能 卡操作到德國。
我可以在第一時間，我們 結果顯示，得去更換
52在我的代碼與32所有實例。
>> 但在這裡，如果我＃定義甲板尺寸 32，在我的代碼的最頂端，
如果我需要去改變它，我可以 隨便去改變一件事。
重新編譯我的代碼，所有的 突然它傳播通過。
事實上，我們可以改變甲板 大小以我們想要的任何值。
>> 我可以你感興趣的 遊戲甲板尺寸皮卡？
>> 我是道格·勞埃德。
這是CS50。