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