1 00:00:00,000 --> 00:00:02,350 >> [音樂播放] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD:好吧。 4 00:00:06,360 --> 00:00:07,770 有種奇怪的話題,對吧? 5 00:00:07,770 --> 00:00:09,050 幻數。 6 00:00:09,050 --> 00:00:12,012 什麼母鹿他的意思時,他的 談到幻數? 7 00:00:12,012 --> 00:00:14,220 嗯,有些節目 我們已經寫在CS50 8 00:00:14,220 --> 00:00:16,660 到目前為止,已經有一些怪異 樣的數字扔在他們。 9 00:00:16,660 --> 00:00:19,680 也許對於原因,我們不 完全理解現在。 10 00:00:19,680 --> 00:00:23,950 例如,在馬里奧問題,我們 皚皚的金字塔的高度在23。 11 00:00:23,950 --> 00:00:26,880 我們明確地說你 不能去高於23。 12 00:00:26,880 --> 00:00:28,702 >> 但什麼是23是什麼意思? 13 00:00:28,702 --> 00:00:30,410 好吧,如果你讀了 仔細SPEC,你 14 00:00:30,410 --> 00:00:32,493 可能已經看到, 因此,我們就封頂在23 15 00:00:32,493 --> 00:00:36,160 是因為標準高度 終端窗口是24。 16 00:00:36,160 --> 00:00:38,860 所以,如果我們有 金字塔比這更高, 17 00:00:38,860 --> 00:00:41,290 它可能會做這種怪異的事情 它跑出畫面。 18 00:00:41,290 --> 00:00:45,140 你知道有哪些呢 這意味著在上下文中,對不對? 19 00:00:45,140 --> 00:00:48,880 >> 是23顯而易見的含義 以人誰看你的程序 20 00:00:48,880 --> 00:00:51,550 也許有不同的 尺寸終端窗口? 21 00:00:51,550 --> 00:00:52,330 很可能不會。 22 00:00:52,330 --> 00:00:53,080 這似乎是,確定。 23 00:00:53,080 --> 00:00:55,005 那麼,為什麼它僅僅不到23? 24 00:00:55,005 --> 00:00:56,880 在一般情況下,它是一種 實際上是一個壞習慣 25 00:00:56,880 --> 00:00:58,940 寫常量到你的代碼。 26 00:00:58,940 --> 00:01:02,190 這樣,當你真正做 寫一個常數到你的代碼, 27 00:01:02,190 --> 00:01:05,630 它有時也被稱為用 幻數,這是一件好事 28 00:01:05,630 --> 00:01:08,030 我們一般要盡量避免。 29 00:01:08,030 --> 00:01:12,830 >> 例如,讓我們一起來看看 在這個簡單的功能在這裡。 30 00:01:12,830 --> 00:01:15,726 顯然沒有數據 用C型稱為卡或甲板。 31 00:01:15,726 --> 00:01:16,600 所以只要多多包涵。 32 00:01:16,600 --> 00:01:18,910 這是一點點 偽混在這裡。 33 00:01:18,910 --> 00:01:21,050 這是一個被調用的函數 處理卡,顯然 34 00:01:21,050 --> 00:01:26,570 取甲板作為它的參數,和 將輸出給我一張卡。 35 00:01:26,570 --> 00:01:30,990 >> 而我做的東西在這裡,我 有運行從0到52的循環, 36 00:01:30,990 --> 00:01:33,394 而我處理一張卡。 37 00:01:33,394 --> 00:01:35,310 好了,我們已經有了一個魔法 在這裡數量,正確的。 38 00:01:35,310 --> 00:01:38,790 你看到了什麼神奇的數字是? 39 00:01:38,790 --> 00:01:42,280 或者更重要的是,你 看到的問題是什麼嗎? 40 00:01:42,280 --> 00:01:44,310 特別是如果這 只是其中的一個功能 41 00:01:44,310 --> 00:01:48,030 在一個它自己的文件 包含文件夾 42 00:01:48,030 --> 00:01:49,970 一堆不同 文件,其每一個 43 00:01:49,970 --> 00:01:51,670 做另一件事,以一副撲克牌。 44 00:01:51,670 --> 00:01:57,310 也許它打亂他們,或涉及手 五張牌,而不是一個單一的卡。 45 00:01:57,310 --> 00:01:59,420 >> 你看到什麼 問題可能是在這裡嗎? 46 00:01:59,420 --> 00:02:03,220 你看到一個神奇的數字 我已經注入的代碼? 47 00:02:03,220 --> 00:02:04,390 這是52吧。 48 00:02:04,390 --> 00:02:06,440 >> 象,直觀的,你可能知道,OK。 49 00:02:06,440 --> 00:02:09,740 就像一個標準的平台 卡中含有52卡。 50 00:02:09,740 --> 00:02:12,570 但是,在我們的程序,它只是 一種漂浮在那裡。 51 00:02:12,570 --> 00:02:15,280 這就像突然有一個52。 52 00:02:15,280 --> 00:02:18,290 >> 解決方法之一 問題是要做到這一點。 53 00:02:18,290 --> 00:02:22,724 我們很明確,現在 呼叫甲板大小為52。 54 00:02:22,724 --> 00:02:25,390 它給了它一個更直觀一點 這意味著在for循環時, 55 00:02:25,390 --> 00:02:28,650 稍後我們,然後說,我 小於甲板大小。 56 00:02:28,650 --> 00:02:32,666 這似乎只是不是說52好。 57 00:02:32,666 --> 00:02:34,290 現在,這並不實際解決問題。 58 00:02:34,290 --> 00:02:38,460 它確實給一些象徵 意到恆定。 59 00:02:38,460 --> 00:02:40,820 但它確實居然有種 引入另一個問題 60 00:02:40,820 --> 00:02:43,770 這可能不會立即顯現出來。 61 00:02:43,770 --> 00:02:45,859 即使這個可變 聲明globally-- 62 00:02:45,859 --> 00:02:47,650 你還記得是什麼 意味著當我們聲明 63 00:02:47,650 --> 00:02:50,500 全球範圍內對局部變量? 64 00:02:50,500 --> 00:02:53,340 即使我們聲明一個變量 全球範圍內,如果有什麼 65 00:02:53,340 --> 00:02:55,500 在另一個函數 我們的套件功能 66 00:02:55,500 --> 00:02:59,750 該處理卡操作 無意中改變甲板的尺寸, 67 00:02:59,750 --> 00:03:02,727 或者通過增加它 1或減1的。 68 00:03:02,727 --> 00:03:04,060 這可能會帶來麻煩,對吧? 69 00:03:04,060 --> 00:03:08,261 特別是當我們正在處理一組 卡在那裡洗牌滿甲板 70 00:03:08,261 --> 00:03:08,760 是必需的。 71 00:03:08,760 --> 00:03:12,804 如果甲板尺寸減小 由1中,例如,至51 72 00:03:12,804 --> 00:03:14,970 我們沒有真正洗牌 所有的卡可能。 73 00:03:14,970 --> 00:03:16,500 我們留給他們的一出。 74 00:03:16,500 --> 00:03:21,680 而該值或許是 預測或不好的演員利用。 75 00:03:21,680 --> 00:03:24,920 >> C提供了什麼叫做 預處理指令,其中 76 00:03:24,920 --> 00:03:27,764 也被稱為一個宏 創建符號常量。 77 00:03:27,764 --> 00:03:30,180 而事實上,你已把 看到一個預處理指令, 78 00:03:30,180 --> 00:03:32,916 即使你還沒有聽說過它 所謂在以#include。 79 00:03:32,916 --> 00:03:37,150 這是一個宏觀的另一個例子 或預處理指令。 80 00:03:37,150 --> 00:03:41,290 >> 該方法來創建符號常量, 或至一個恆定給出名稱 81 00:03:41,290 --> 00:03:43,740 使之具有更 這意味著,如下。 82 00:03:43,740 --> 00:03:47,030 #定義,名稱更換。 83 00:03:47,030 --> 00:03:49,140 拋開真的很重要 這裡真快。 84 00:03:49,140 --> 00:03:54,180 不要把一個分號 您#定義的末端。 85 00:03:54,180 --> 00:03:57,310 所以這是#定義,名稱,更換。 86 00:03:57,310 --> 00:03:59,540 >> 當你的程序編譯, 實際發生的事情 87 00:03:59,540 --> 00:04:01,740 是編譯器,如果打算 要通過您的代碼 88 00:04:01,740 --> 00:04:06,770 更換的每個實例 單詞“名稱”不管你 89 00:04:06,770 --> 00:04:08,860 把作為替代。 90 00:04:08,860 --> 00:04:13,060 類似地,如果是#包括排序 類似於複製和粘貼, 91 00:04:13,060 --> 00:04:15,700 那麼#定義是有點 類似於查找和替換, 92 00:04:15,700 --> 00:04:19,180 如果你曾經使用過該功能的 文字處理程序,例如。 93 00:04:19,180 --> 00:04:26,345 >> 因此,舉例來說,如果我 #定義PI為3.14159265, 94 00:04:26,345 --> 00:04:28,720 如果你有更好的數學 傾斜你突然 95 00:04:28,720 --> 00:04:31,640 看到3.14159265飛行 圍繞在你的代碼, 96 00:04:31,640 --> 00:04:33,517 你可能知道它在談論圓周率。 97 00:04:33,517 --> 00:04:35,850 但也許我們可以給它一個 多一點象徵意義。 98 00:04:35,850 --> 00:04:39,850 我們可以改為說的#define 作為圓周率的數字是一口 99 00:04:39,850 --> 00:04:42,110 我不是要保持 讀了個遍。 100 00:04:42,110 --> 00:04:45,560 >> 什麼事情發生,然後在 編譯的時候是當程序 101 00:04:45,560 --> 00:04:48,530 編譯後,第一件事就是 會發生的是它會經過 102 00:04:48,530 --> 00:04:51,520 它將取代每次 它認為資本磷,資金我, 103 00:04:51,520 --> 00:04:55,610 它會用它的字面取代 3.14等等,讓你 104 00:04:55,610 --> 00:04:58,090 不必鍵入它的每一個 時間,而你仍然程序 105 00:04:58,090 --> 00:05:00,631 具有的功能,你 期待,因為你的工作 106 00:05:00,631 --> 00:05:05,090 與操縱,乘, 分割,不管它是圓周率。 107 00:05:05,090 --> 00:05:08,230 >> 你並不限於此 替代只有數字。 108 00:05:08,230 --> 00:05:12,279 例如,我可以#定義 當然,作為字符串CS50。 109 00:05:12,279 --> 00:05:14,070 在這種情況下,當 編譯程序, 110 00:05:14,070 --> 00:05:16,236 #定義將通過 代碼,替換每次 111 00:05:16,236 --> 00:05:19,900 它認為“課程”的字符串CS50。 112 00:05:19,900 --> 00:05:21,720 >> 你會發現在這裡 也是我經常 113 00:05:21,720 --> 00:05:26,090 #定義我的所有定義的符號 常量,可以這麼說, 114 00:05:26,090 --> 00:05:28,130 總是全部大寫。 115 00:05:28,130 --> 00:05:28,960 這是一個慣例。 116 00:05:28,960 --> 00:05:30,170 它不是必需的。 117 00:05:30,170 --> 00:05:33,900 究其原因一般人會用 當他們#defining全部大寫 118 00:05:33,900 --> 00:05:37,590 只是,使其真正清楚, 我的代碼這個特定元素 119 00:05:37,590 --> 00:05:38,820 是一個定義的常量。 120 00:05:38,820 --> 00:05:43,730 如果是小寫的,它可能是 它可能被混淆的變量。 121 00:05:43,730 --> 00:05:46,120 而這可能 不是一個很好的事情。 122 00:05:46,120 --> 00:05:48,910 >> 因此,這個特殊的 溶液好得多 123 00:05:48,910 --> 00:05:50,550 比任何以往的。 124 00:05:50,550 --> 00:05:59,950 如果我第一次的#define甲板尺寸52,然後 現在我使用的52,或甲板的大小在這裡, 125 00:05:59,950 --> 00:06:01,850 很多更直觀,安全很多。 126 00:06:01,850 --> 00:06:03,280 你不能操縱一個常數。 127 00:06:03,280 --> 00:06:05,259 你不能說52加再加。 128 00:06:05,259 --> 00:06:06,800 這是不會將其轉換為53。 129 00:06:06,800 --> 00:06:09,390 你不能改變52的東西。 130 00:06:09,390 --> 00:06:12,470 >> 你可以改變一個變量 它的值是52, 131 00:06:12,470 --> 00:06:14,870 這是我們收到的第一個補丁。 132 00:06:14,870 --> 00:06:17,000 你可能會增加 該變量為53。 133 00:06:17,000 --> 00:06:21,100 但你不能說52加上加號和 有搖身變成52 53。 134 00:06:21,100 --> 00:06:23,350 52永遠是52。 135 00:06:23,350 --> 00:06:28,860 所以你不能在不經意間改變 甲板尺寸在這裡通過操縱它, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> 另一個好的一面 這雖然效果是 138 00:06:32,390 --> 00:06:38,310 這是你知道不 全世界所有國家 139 00:06:38,310 --> 00:06:40,690 使用的大小52一副撲克牌? 140 00:06:40,690 --> 00:06:45,630 例如,它在真正的共同 德國使用的32甲板的尺寸, 141 00:06:45,630 --> 00:06:48,020 他們剝離了一些 的較低值卡。 142 00:06:48,020 --> 00:06:50,960 在這種情況下,我 希望我的口套房 143 00:06:50,960 --> 00:06:55,390 那處理功能 卡操作到德國。 144 00:06:55,390 --> 00:06:59,440 我可以在第一時間,我們 結果顯示,得去更換 145 00:06:59,440 --> 00:07:03,570 52在我的代碼與32所有實例。 146 00:07:03,570 --> 00:07:07,940 >> 但在這裡,如果我#定義甲板尺寸 32,在我的代碼的最頂端, 147 00:07:07,940 --> 00:07:11,730 如果我需要去改變它,我可以 隨便去改變一件事。 148 00:07:11,730 --> 00:07:15,010 重新編譯我的代碼,所有的 突然它傳播通過。 149 00:07:15,010 --> 00:07:18,850 事實上,我們可以改變甲板 大小以我們想要的任何值。 150 00:07:18,850 --> 00:07:22,500 >> 我可以你感興趣的 遊戲甲板尺寸皮卡? 151 00:07:22,500 --> 00:07:23,430 >> 我是道格·勞埃德。 152 00:07:23,430 --> 00:07:25,840 這是CS50。 153 00:07:25,840 --> 00:07:27,772