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