[音樂播放] 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。