1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J.马兰:这是CS50和 这是4周的开始。 3 00:00:14,050 --> 00:00:18,630 而且,男孩,是大众汽车 都是因为软件的麻烦。 4 00:00:18,630 --> 00:00:20,264 让我们一起来看看。 5 00:00:20,264 --> 00:00:20,930 [视频回放] 6 00:00:20,930 --> 00:00:25,560 -Cars,最聪明的人物 在速度与激情的电影。 7 00:00:25,560 --> 00:00:29,100 本周,德国汽车制造商 大众发现自己 8 00:00:29,100 --> 00:00:32,490 在丑闻的中间 潜在犯罪的比例。 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen是支撑数十亿 罚款,可能的刑事指控 10 00:00:36,060 --> 00:00:38,560 它的高管,如 该公司道歉 11 00:00:38,560 --> 00:00:41,840 为索具1100多万辆汽车,以 帮助它战胜排放测试。 12 00:00:41,840 --> 00:00:44,950 >> - 某些柴油车型分别为 设计与先进的软件 13 00:00:44,950 --> 00:00:48,440 即使用信息,包括 转向和车辆的位置 14 00:00:48,440 --> 00:00:51,870 速度来确定赛车 进行排放检测。 15 00:00:51,870 --> 00:00:55,650 该种情况下,发动机 会减少有毒物质的排放。 16 00:00:55,650 --> 00:00:59,070 但车被人做了手脚旁路 当它被驱动。 17 00:00:59,070 --> 00:01:03,320 排放量增加10至40 次以上可以接受的EPA水平。 18 00:01:03,320 --> 00:01:04,280 >> [结束播放] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J.马兰:所以,让我们 看看这个 20 00:01:05,220 --> 00:01:07,250 看看这是怎样 可能实施 21 00:01:07,250 --> 00:01:09,680 以及如何这可能会影响 这么多车这样。 22 00:01:09,680 --> 00:01:12,840 所以在我的手里这里的新闻 释放由EPA--发行 23 00:01:12,840 --> 00:01:14,620 环境 保护机构这 24 00:01:14,620 --> 00:01:18,032 是美国的监管机构, 处理环境问题, 25 00:01:18,032 --> 00:01:19,740 然后将实际 这是法律声明 26 00:01:19,740 --> 00:01:22,420 短短数天前发送给大众。 27 00:01:22,420 --> 00:01:26,530 >> 因此,EPA写道,现在公开 公开,一个成熟的软件 28 00:01:26,530 --> 00:01:29,390 算法的某些 大众汽车检测 29 00:01:29,390 --> 00:01:32,630 当汽车发生 官方的排放测试 30 00:01:32,630 --> 00:01:36,505 和原来完全排放 只在测试过程中控制上。 31 00:01:36,505 --> 00:01:38,380 的有效性 这些车辆污染 32 00:01:38,380 --> 00:01:43,260 排放控制设备是很大的 在所有正常行驶减少 33 00:01:43,260 --> 00:01:44,320 的情况。 34 00:01:44,320 --> 00:01:48,190 这导致符合汽车 在实验室或测试标准 35 00:01:48,190 --> 00:01:52,790 站,但在正常操作期间 排出的氮oxides--或NOx-- 36 00:01:52,790 --> 00:01:54,950 在高达40倍的标准。 37 00:01:54,950 --> 00:01:58,220 由大众汽车公司生产的软件 是报价引文结束,落败的设备, 38 00:01:58,220 --> 00:02:00,650 由清洁的定义 美国空气法案。 39 00:02:00,650 --> 00:02:03,410 >> 他们接着说, EPA和其他机构 40 00:02:03,410 --> 00:02:07,020 发现的失利装置 后独立分析软件 41 00:02:07,020 --> 00:02:09,660 研究人员在西 弗吉尼亚大学。 42 00:02:09,660 --> 00:02:14,160 氮氧化物污染有利于 二氧化氮,地面臭氧, 43 00:02:14,160 --> 00:02:15,700 和细小颗粒物质。 44 00:02:15,700 --> 00:02:18,090 暴露于这些 污染物已被链接 45 00:02:18,090 --> 00:02:20,870 具有广泛的 严重的健康影响, 46 00:02:20,870 --> 00:02:23,637 包括增加哮喘 攻击等呼吸道 47 00:02:23,637 --> 00:02:26,470 疾病,可以足够严重 派人到医院就诊。 48 00:02:26,470 --> 00:02:28,660 暴露于臭氧和 颗粒物质还具有 49 00:02:28,660 --> 00:02:31,960 过早被相关 死亡是由于呼吸相关 50 00:02:31,960 --> 00:02:35,690 或心血管相关的影响。 51 00:02:35,690 --> 00:02:38,940 儿童,老人,残疾人 预先存在的呼吸系统疾病 52 00:02:38,940 --> 00:02:42,840 尤其在风险 这些污染物对健康的影响。 53 00:02:42,840 --> 00:02:45,056 >> 我只想是说,这是相当严重的。 54 00:02:45,056 --> 00:02:46,930 让我们继续阅读 只是多一个节选 55 00:02:46,930 --> 00:02:49,370 然后我们将看看 潜在影响 56 00:02:49,370 --> 00:02:50,920 这在汽车的情况下。 57 00:02:50,920 --> 00:02:53,730 具体而言,大众汽车 制造和安装 58 00:02:53,730 --> 00:02:56,210 软件在所谓的 电子控制 59 00:02:56,210 --> 00:02:59,320 module--或ECM-- 这些车辆感测 60 00:02:59,320 --> 00:03:03,580 当车辆正在测试为 符合EPA排放标准。 61 00:03:03,580 --> 00:03:07,510 基于各种输入,包括 方向盘的位置时,车辆 62 00:03:07,510 --> 00:03:11,280 速,发动机的持续时间 操作,并且大气压力, 63 00:03:11,280 --> 00:03:13,720 这些输入准确 跟踪参数 64 00:03:13,720 --> 00:03:17,600 用于联邦测试程序的 对于EPA认证排放测试 65 00:03:17,600 --> 00:03:18,400 的目的。 66 00:03:18,400 --> 00:03:21,850 >> 在美国环保局的排放测试, 车辆ECM软件 67 00:03:21,850 --> 00:03:25,060 然其生产的软件 标准的排放结果。 68 00:03:25,060 --> 00:03:28,340 在其他时候, 车辆ECM软件 69 00:03:28,340 --> 00:03:31,090 跑了独立的道路 校准从而减少 70 00:03:31,090 --> 00:03:34,360 的有效性 整体排放控制系统, 71 00:03:34,360 --> 00:03:37,864 具体地,选择性催化 降低贫NO x的trap-- 72 00:03:37,864 --> 00:03:39,280 我们将看到在某一时刻。 73 00:03:39,280 --> 00:03:43,040 NO x的结果,排放 增加10至40倍的因子 74 00:03:43,040 --> 00:03:47,450 上面的EPA标准的水平 根据驱动周期的类型。 75 00:03:47,450 --> 00:03:50,800 >> 那么这到底是什么意思,和 源代码的软件的运行 76 00:03:50,800 --> 00:03:53,190 在大众汽车的还没有 尚未公开披露, 77 00:03:53,190 --> 00:03:56,460 是,有效地,这 相当于是冥冥之中有内 78 00:03:56,460 --> 00:03:57,830 大众的代码。 79 00:03:57,830 --> 00:04:02,200 如果正在测试,和如果车 检测某些环境因素 80 00:04:02,200 --> 00:04:04,330 像方向盘 位置或运动 81 00:04:04,330 --> 00:04:06,710 或缺乏的车或 任何数量的其它因素 82 00:04:06,710 --> 00:04:09,940 当前假设 是这个配方的一部分, 83 00:04:09,940 --> 00:04:12,370 他们只需打开 全排放控制。 84 00:04:12,370 --> 00:04:15,670 换言之,便开始 排放减少污染物。 85 00:04:15,670 --> 00:04:18,769 >> 否则,在每一个其它情况 当它不被检测为 86 00:04:18,769 --> 00:04:20,790 在实验室里,他们只是不。 87 00:04:20,790 --> 00:04:24,320 所以你可以简化成多 具体的伪代码的东西 88 00:04:24,320 --> 00:04:24,820 像这样。 89 00:04:24,820 --> 00:04:27,810 如果车轮转动,但 方向盘不是,暗示 90 00:04:27,810 --> 00:04:30,060 这辆车是一些 一种转筒 91 00:04:30,060 --> 00:04:32,550 但在某种 仓库正在测试中, 92 00:04:32,550 --> 00:04:36,070 然后表现为 EPA想你。 93 00:04:36,070 --> 00:04:37,960 否则不。 94 00:04:37,960 --> 00:04:40,420 因此,让我们一起来看看 在短视频的 95 00:04:40,420 --> 00:04:45,391 考虑看看哪些影响 是这实际上机械。 96 00:04:45,391 --> 00:04:48,620 >> [视频回放] 97 00:04:48,620 --> 00:04:52,800 >> -Last周五美国环保署宣布部分 2009年之间进行大众奥迪汽车 98 00:04:52,800 --> 00:04:55,840 而今年用 所谓败设备 99 00:04:55,840 --> 00:04:59,060 要解决排放法规 旨在保持空气清洁。 100 00:04:59,060 --> 00:05:01,700 但是,这是什么意思是什么呢? 101 00:05:01,700 --> 00:05:04,666 >> 那么,现代汽车有几十个 里面他们的计算机。 102 00:05:04,666 --> 00:05:07,040 而其中的一些计算机 帮助协调功能 103 00:05:07,040 --> 00:05:09,590 发动机为最佳的 同时确保性能 104 00:05:09,590 --> 00:05:12,340 有没有太垃圾了 走出排气管。 105 00:05:12,340 --> 00:05:15,170 他们实际上已经工作 这种方式对于现在几十年。 106 00:05:15,170 --> 00:05:17,380 基本上,每一个部分 现代汽车的发动机 107 00:05:17,380 --> 00:05:20,080 具有传感器或控制器 就可以了,而这些计算机 108 00:05:20,080 --> 00:05:23,460 正在阅读数据数千 每秒进行调整时间 109 00:05:23,460 --> 00:05:26,220 像燃料与空气的比率 那将会进入汽缸。 110 00:05:26,220 --> 00:05:28,730 >> 这些欺骗大众 和奥迪车型都是柴油车, 111 00:05:28,730 --> 00:05:30,890 和柴油多了一个 真正重要的计算机 112 00:05:30,890 --> 00:05:34,030 控制参数,这是 未燃燃料的去量 113 00:05:34,030 --> 00:05:35,200 到排气。 114 00:05:35,200 --> 00:05:36,310 现在,听起来很糟糕。 115 00:05:36,310 --> 00:05:39,642 听起来并不像你想 未燃烧的燃料在进入排气。 116 00:05:39,642 --> 00:05:41,600 但在一个的情况下 柴油,你有什么 117 00:05:41,600 --> 00:05:46,110 所谓的NOx捕集器是一种装置,其 吸收和陷阱的氮氧化物 118 00:05:46,110 --> 00:05:48,880 这是污染物会 否则进入大气中。 119 00:05:48,880 --> 00:05:53,040 这NOx捕集效果 是加强与未燃烧的燃料。 120 00:05:53,040 --> 00:05:56,650 所以一场失利设备是一个特殊的程序 里面的这些计算机,可以使 121 00:05:56,650 --> 00:05:59,527 看起来像汽车达到排放 标准,即使它没有。 122 00:05:59,527 --> 00:06:01,110 大众汽车有一个问题就烦。 123 00:06:01,110 --> 00:06:04,050 它的柴油发动机被称为 获取巨大的燃油经济性, 124 00:06:04,050 --> 00:06:07,510 但NOx捕集仅工作良好 当更多的燃料正被使用。 125 00:06:07,510 --> 00:06:10,460 所以车子就发现, 使用这种设备的失利, 126 00:06:10,460 --> 00:06:13,870 当它得到了一个排放 测试中,它会使用更多的燃料, 127 00:06:13,870 --> 00:06:16,830 使NOx捕集工作做好, 排放量将被罚款。 128 00:06:16,830 --> 00:06:21,130 但你得到的道路上,该装置 关闭时,你燃烧更少的燃料 129 00:06:21,130 --> 00:06:24,256 但是你把高达40倍 更多的污染物进入大气。 130 00:06:24,256 --> 00:06:26,130 但到底如何做 轿厢知道是 131 00:06:26,130 --> 00:06:27,720 被测试的排放标准? 132 00:06:27,720 --> 00:06:30,590 环保局说,这是一个复杂的 系统检查的事 133 00:06:30,590 --> 00:06:34,090 像方向盘的位置, 速度快,发动机有多长时, 134 00:06:34,090 --> 00:06:35,507 甚至大气压。 135 00:06:35,507 --> 00:06:37,673 换句话说,有 没办法,这是意外 136 00:06:37,673 --> 00:06:40,260 因为软件是 设计得非常仔细地检测 137 00:06:40,260 --> 00:06:41,630 正式排放测试。 138 00:06:41,630 --> 00:06:43,588 这是一些相当严重 欺骗,这就是 139 00:06:43,588 --> 00:06:45,420 为什么大众在 如此严重的麻烦。 140 00:06:45,420 --> 00:06:48,600 事实上,他们的CEO,马丁 文德恩,刚刚卸任。 141 00:06:48,600 --> 00:06:49,820 >> 那么接下来会发生什么? 142 00:06:49,820 --> 00:06:53,900 好吧,如果你的一半万分之一 柴油捷达,甲壳虫,的高尔夫,帕萨特, 143 00:06:53,900 --> 00:06:56,220 或者奥迪A3S影响, 好在是 144 00:06:56,220 --> 00:06:57,886 你的车仍然是安全驾驶。 145 00:06:57,886 --> 00:07:00,510 你不必把它扔掉 直到大众汽车发布召回。 146 00:07:00,510 --> 00:07:02,509 但在某些时候,他们是 可能将不得不 147 00:07:02,509 --> 00:07:04,230 更新你的车里面的软件。 148 00:07:04,230 --> 00:07:06,927 当发生这种情况你可能 得到每罐少英里。 149 00:07:06,927 --> 00:07:09,260 律师们早已摩拳擦掌 弥补集体诉讼 150 00:07:09,260 --> 00:07:12,500 因此,业主可以得到补偿 在未来的某个时候。 151 00:07:12,500 --> 00:07:15,832 但是,这不会 发生任何时间很快。 152 00:07:15,832 --> 00:07:16,711 >> [结束播放] 153 00:07:16,711 --> 00:07:19,960 DAVID J.马兰:所以这实际上提高了 一个有趣的大局观问题 154 00:07:19,960 --> 00:07:20,660 作为信任。 155 00:07:20,660 --> 00:07:21,160 对? 156 00:07:21,160 --> 00:07:24,300 我们每个人都有的iPhone或机器人或 东西在我们的口袋里最有可能 157 00:07:24,300 --> 00:07:26,500 这些天来,或笔记本电脑 在我们圈是 158 00:07:26,500 --> 00:07:28,510 发运行的软件 苹果和微软 159 00:07:28,510 --> 00:07:30,710 其他公司和束。 160 00:07:30,710 --> 00:07:34,240 但是我们怎么知道什么 这些软件产品都在做 161 00:07:34,240 --> 00:07:37,680 实际上是什么,这些 公司表示,他们正在做什么? 162 00:07:37,680 --> 00:07:39,610 >> 举例来说,谁的 说,你每次 163 00:07:39,610 --> 00:07:42,200 打个电话在您的iPhone 或Android手机或类似, 164 00:07:42,200 --> 00:07:45,650 ,这一电话号码也不是 被上传到一些公司的服务器 165 00:07:45,650 --> 00:07:48,399 因为有些节目你已经 写的,无论是操作 166 00:07:48,399 --> 00:07:51,070 系统本身喜欢的iOS或Android, 还是因为你已经下载 167 00:07:51,070 --> 00:07:53,880 一些第三方应用程序 不知怎的被监听 168 00:07:53,880 --> 00:07:57,120 一切你打字或 一切你实际上说。 169 00:07:57,120 --> 00:07:59,500 你怎么知道的是,当 你们正在运行锵 170 00:07:59,500 --> 00:08:02,590 或者让编译您 在CS50,怎么自己的软件 171 00:08:02,590 --> 00:08:06,080 你认为CS50自己的员工, 由CS50库的方式, 172 00:08:06,080 --> 00:08:08,690 一直没有记录每 你收到的字符串 173 00:08:08,690 --> 00:08:10,276 还是地地道道你收到? 174 00:08:10,276 --> 00:08:12,900 那么,你当然可以看 在东西的源代码 175 00:08:12,900 --> 00:08:15,233 像CS50库, 可以看看源代码 176 00:08:15,233 --> 00:08:18,170 对于Linux操作系统 在CS50 IDE中运行。 177 00:08:18,170 --> 00:08:23,090 但是,一个惊人的表现 给予早在1984年 178 00:08:23,090 --> 00:08:26,730 在收到的图灵奖由 已知的非常著名的计算机科学家 179 00:08:26,730 --> 00:08:29,750 as--叫肯·汤普森谁 获得了图灵奖哪些 180 00:08:29,750 --> 00:08:33,500 是有点计算机科学的 诺贝尔文学奖,如果你愿意, 181 00:08:33,500 --> 00:08:35,309 他在一个工作 操作系统被称为 182 00:08:35,309 --> 00:08:39,039 Unix的,这是在非常相似 精神,我们使用的是Linux操作系统。 183 00:08:39,039 --> 00:08:41,960 他问的问题,他的 获奖感言,基本上 184 00:08:41,960 --> 00:08:44,910 放下了框架 年复一年的讨论 185 00:08:44,910 --> 00:08:46,970 关于信任和安全,是这样的。 186 00:08:46,970 --> 00:08:50,410 应在多大程度上一个信任一个 声明一program--一块 187 00:08:50,410 --> 00:08:53,010 的software--是免费的木马? 188 00:08:53,010 --> 00:08:56,500 也许是信任更重要 谁写的软件的人。 189 00:08:56,500 --> 00:08:58,650 >> 而事实上,我们已经链接 该传言称,他 190 00:08:58,650 --> 00:09:02,400 在接受这一奖项时,给了 在CS50网站上的80年代 191 00:09:02,400 --> 00:09:04,030 在今天的讲座页。 192 00:09:04,030 --> 00:09:06,071 因为你会看到什么 是,他居然给 193 00:09:06,071 --> 00:09:09,430 怎么连一个相当简单的例子 编译器像锵或什么 194 00:09:09,430 --> 00:09:13,950 编译器他人已经使用在过去, 如果嵌入了编译器,我们什么 195 00:09:13,950 --> 00:09:18,190 自己使用是一个几乎没有 条件,基本上说, 196 00:09:18,190 --> 00:09:22,360 如果您发现该代码使用 在GetString函数或调用getInt 197 00:09:22,360 --> 00:09:26,600 功能,继续前进,插入 后门或木马 198 00:09:26,600 --> 00:09:29,340 这样该程序 现在有一些零 199 00:09:29,340 --> 00:09:30,930 和那些做一些恶意的。 200 00:09:30,930 --> 00:09:33,080 记录你的所有 按键,上传数据 201 00:09:33,080 --> 00:09:35,100 一些服务器,还是真的什么。 202 00:09:35,100 --> 00:09:37,290 >> 什么肯·汤普森 继续做他的谈话 203 00:09:37,290 --> 00:09:40,580 是要证明,即使 您可以访问源 204 00:09:40,580 --> 00:09:43,794 编译器的代码 恶意可能会做这个, 205 00:09:43,794 --> 00:09:46,210 这并不重要,因为 有这种鸡与蛋 206 00:09:46,210 --> 00:09:49,500 过去的许多现实 年即编译器 207 00:09:49,500 --> 00:09:51,960 用于编译自己。 208 00:09:51,960 --> 00:09:55,440 换句话说,一个人回来的路上时, 只好写了第一个编译器。 209 00:09:55,440 --> 00:09:59,060 此后,任何时候他们已经更新 一个编译器,通过改变它的源代码, 210 00:09:59,060 --> 00:10:02,020 增加功能并重新编译 对于我们这样的人使用,那么, 211 00:10:02,020 --> 00:10:04,270 他们使用旧的 版本的编译器 212 00:10:04,270 --> 00:10:06,370 编译新 版本的编译器。 213 00:10:06,370 --> 00:10:08,370 如果你看看 在他给了谈话, 214 00:10:08,370 --> 00:10:10,970 你会看到,由于 那个圆的, 215 00:10:10,970 --> 00:10:14,330 你其实可以有错误或 木马嵌入软件 216 00:10:14,330 --> 00:10:14,990 我们使用。 217 00:10:14,990 --> 00:10:18,010 而且,即使你看 源代码的程序, 218 00:10:18,010 --> 00:10:21,550 它甚至可能不是显而易见 因为挂羊头卖狗肉实际上是 219 00:10:21,550 --> 00:10:24,710 在一个有些旧版本 编译器,从此便 220 00:10:24,710 --> 00:10:27,340 注入威胁到我们的软件。 221 00:10:27,340 --> 00:10:29,740 >> 这仅仅是说,我们 真的不能也不应该 222 00:10:29,740 --> 00:10:32,939 在我们的笔记本电脑信任的软件运行 或电话或任何数量的位。 223 00:10:32,939 --> 00:10:36,230 而事实上,后来在这个学期的时候 我们开始谈论网络编程 224 00:10:36,230 --> 00:10:38,521 而真正开始建设 Web应用程序自己, 225 00:10:38,521 --> 00:10:40,285 我们将谈论这些 威胁和其他。 226 00:10:40,285 --> 00:10:43,410 现在,你可能想知道,发现 ,有一个小小的达斯 227 00:10:43,410 --> 00:10:45,842 维达的剪辑 边缘是显示有 228 00:10:45,842 --> 00:10:47,550 关于大众。是否 你从来没有见过,我 229 00:10:47,550 --> 00:10:49,190 认为我们应该减轻 心情,因为这是所有 230 00:10:49,190 --> 00:10:50,780 很郁闷的和可怕的。 231 00:10:50,780 --> 00:10:52,910 我要回头看 在超级杯2011 232 00:10:52,910 --> 00:10:55,300 当一个商业用 Volkswagen--这 233 00:10:55,300 --> 00:10:59,620 几乎让他们可爱的again-- 播出,第一次在电视上。 234 00:10:59,620 --> 00:11:04,039 这是60秒的剪辑 我想你会喜欢。 235 00:11:04,039 --> 00:11:04,705 [视频回放] 236 00:11:04,705 --> 00:11:08,198 [MUSIC - 题材从“星球大战”] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [狗叫] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [汽车启动] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [结束播放] 243 00:12:05,955 --> 00:12:06,830 DAVID J.马兰:是的。 244 00:12:06,830 --> 00:12:07,663 我只是检查。 245 00:12:07,663 --> 00:12:11,360 这车是违规的名单上。 246 00:12:11,360 --> 00:12:12,000 好吧。 247 00:12:12,000 --> 00:12:14,040 所以我们看一些 前伪片刻。 248 00:12:14,040 --> 00:12:15,380 这里是一个更大的 的伪代码段 249 00:12:15,380 --> 00:12:16,921 我们已经见过几次迄今。 250 00:12:16,921 --> 00:12:19,970 而让我们使用这是一个机会 现在来介绍一种新的编程 251 00:12:19,970 --> 00:12:23,776 我们做技术 见算法 252 00:12:23,776 --> 00:12:25,400 上周,当我们看着归并排序。 253 00:12:25,400 --> 00:12:28,270 但是,让我们正式确定一下,看看如何 我们可以使用它在实际的代码, 254 00:12:28,270 --> 00:12:30,350 然后我们将使用这个 技术的道路最 255 00:12:30,350 --> 00:12:32,000 可能解决某些其他问题。 256 00:12:32,000 --> 00:12:35,790 >> 所以这是第一个项目之一,我们 曾经写道,尽管在伪代码。 257 00:12:35,790 --> 00:12:37,790 而这是什么程序 让我们做课程 258 00:12:37,790 --> 00:12:41,510 是要找到麦克·史密斯在电话簿。 259 00:12:41,510 --> 00:12:46,216 同时注意在特定行8 和11有这样转到声明。 260 00:12:46,216 --> 00:12:48,090 而事实上,某些 语言,C其中, 261 00:12:48,090 --> 00:12:50,006 实际上确实有 声明字面上 262 00:12:50,006 --> 00:12:52,710 去,让你 跳转到指定的行。 263 00:12:52,710 --> 00:12:55,470 一旦因为它是一般不赞成 它可以很容易被滥用 264 00:12:55,470 --> 00:12:58,490 你就可以开始你的跳跃 项目所有的地方,而不是 265 00:12:58,490 --> 00:13:00,690 使用的那种 逻辑和控制流 266 00:13:00,690 --> 00:13:04,000 我们已经使用迄今只 循环和条件等。 267 00:13:04,000 --> 00:13:08,660 >> 但是,我们可以简化这个算法 在伪代码如下。 268 00:13:08,660 --> 00:13:11,250 相反,这种反复的 或循环的方法 269 00:13:11,250 --> 00:13:14,160 我们一直走去, 回来,回到线三条, 270 00:13:14,160 --> 00:13:18,300 正中下怀我们为什么不踢多 一般说,在七号线和10, 271 00:13:18,300 --> 00:13:20,570 只需更换这两个 对用线, 272 00:13:20,570 --> 00:13:22,810 否则,如果史密斯早 在本书中,我们将 273 00:13:22,810 --> 00:13:25,110 搜索麦克在 书的左半边。 274 00:13:25,110 --> 00:13:28,560 否则,如果史密斯后来在 书,在右边的搜索麦克 275 00:13:28,560 --> 00:13:29,540 一半的书。 276 00:13:29,540 --> 00:13:31,180 同时注意已圆。 277 00:13:31,180 --> 00:13:31,680 对? 278 00:13:31,680 --> 00:13:34,250 我在寻找迈克 电话簿,然后 279 00:13:34,250 --> 00:13:37,090 我最终也许打 七号线或者10号线 280 00:13:37,090 --> 00:13:41,089 和我的指令对自己的搜索 麦克一半的电话簿。 281 00:13:41,089 --> 00:13:42,380 好了,我怎么寻找迈克? 282 00:13:42,380 --> 00:13:44,213 我在中间 搜索麦克,为什么 283 00:13:44,213 --> 00:13:45,860 样的,你给我转了一圈? 284 00:13:45,860 --> 00:13:49,590 但是,这是因为什么是确定 情况发生的问题的大小, 285 00:13:49,590 --> 00:13:52,630 写在管线7和10? 286 00:13:52,630 --> 00:13:54,989 我们不只是说搜索 麦克,搜索麦克。 287 00:13:54,989 --> 00:13:56,280 我们具体说了什么? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 在左半边寻找他 右半边是有效 290 00:14:01,610 --> 00:14:03,440 该问题的一半大小。 291 00:14:03,440 --> 00:14:07,170 所以没关系,我们是那种 搞这个循环, 292 00:14:07,170 --> 00:14:09,180 这种循环论证, 因为至少我们 293 00:14:09,180 --> 00:14:11,090 使问题越来越小。 294 00:14:11,090 --> 00:14:14,220 而最终我们将到达 即所谓的基的情况下 295 00:14:14,220 --> 00:14:16,780 我们只有一个页面left-- 上周我们的志愿者 296 00:14:16,780 --> 00:14:18,684 did--我们有一个页面 离开,然后我们不 297 00:14:18,684 --> 00:14:21,600 要不断寻找麦克·史密斯 因为他无论是在该网页上 298 00:14:21,600 --> 00:14:23,080 或者他是不是。 299 00:14:23,080 --> 00:14:27,480 >> 那么我们怎样才能实现这个想法,这个 排序圆在实际的代码吗? 300 00:14:27,480 --> 00:14:31,030 好了,我们可以利用技术 该真实一般被称为递归。 301 00:14:31,030 --> 00:14:33,960 我们已经看到了这个在 伪代码归并排序最后一周。 302 00:14:33,960 --> 00:14:37,190 回想一下,这是 伪代码归并排序。 303 00:14:37,190 --> 00:14:40,560 这可以说是比更简单 泡沫或选择或插入排序 304 00:14:40,560 --> 00:14:43,310 只是在简单计 使用它可以表达出来。 305 00:14:43,310 --> 00:14:46,750 >> 但是,这是因为 我们是那种圆 306 00:14:46,750 --> 00:14:51,350 他说,搜索的东西 通过再次寻找它。 307 00:14:51,350 --> 00:14:53,960 但是,我们正在寻找无论是在 左半或右半 308 00:14:53,960 --> 00:14:56,070 然后最终我们 合并在此情况下。 309 00:14:56,070 --> 00:14:58,520 但在这里,也与 这两种类型的线条, 310 00:14:58,520 --> 00:15:01,320 没有我们再次有这样的 想法递归。 311 00:15:01,320 --> 00:15:05,350 而具体是什么意思, 在一个算法的上下文中, 312 00:15:05,350 --> 00:15:10,880 是一个算法是递归 如果使用或调用本身。 313 00:15:10,880 --> 00:15:14,330 >> 或用C方面,一个功能是 recursive--一个调用的函数 314 00:15:14,330 --> 00:15:18,510 foo是递归的,如果FOO, 某处它的源代码, 315 00:15:18,510 --> 00:15:21,250 调用函数foo本身。 316 00:15:21,250 --> 00:15:25,790 而这一切的话永远富不坏 是一次次给自己。 317 00:15:25,790 --> 00:15:30,600 这是确定的,如果FOO最终停止,一样 归并排序,说,等一下, 318 00:15:30,600 --> 00:15:32,980 如果这个问题是超 小,例如, 319 00:15:32,980 --> 00:15:35,840 或者我发现他的人,我 寻找,只是返回。 320 00:15:35,840 --> 00:15:41,000 不要递归,不 周期性再次调用自己。 321 00:15:41,000 --> 00:15:44,200 >> 因此,让我们一起来看看 这是如何实际工作。 322 00:15:44,200 --> 00:15:48,430 所以,我要继续前进,开 在这里两个源代码示例。 323 00:15:48,430 --> 00:15:50,321 其中之一称为西格玛0。 324 00:15:50,321 --> 00:15:52,320 这是不是在所有 递归,但让我们 325 00:15:52,320 --> 00:15:53,694 一起来看看这是什么程序做。 326 00:15:53,694 --> 00:15:55,737 我已经去除了所有 从中但所有评论 327 00:15:55,737 --> 00:15:58,070 对CS50的源代码 网站上有,如果你的意见 328 00:15:58,070 --> 00:15:59,570 希望通过它来读取一次。 329 00:15:59,570 --> 00:16:02,010 而让我们做一对夫妇 神智检查这里。 330 00:16:02,010 --> 00:16:06,640 >> 因此,在这段代码的顶部, 我们有包括CS50.h. 331 00:16:06,640 --> 00:16:07,650 这是什么呢? 332 00:16:07,650 --> 00:16:08,990 这里为什么是它? 333 00:16:08,990 --> 00:16:11,740 在合理通俗地说。 334 00:16:11,740 --> 00:16:12,424 它做什么? 335 00:16:12,424 --> 00:16:12,858 是啊。 336 00:16:12,858 --> 00:16:14,160 >> 听众:所以调用getInt功能工作。 337 00:16:14,160 --> 00:16:16,243 >> DAVID J.马兰:所以这 调用getInt功能工作。 338 00:16:16,243 --> 00:16:18,115 因为这里面 文件CS50.h,这 339 00:16:18,115 --> 00:16:20,950 不久的我们会看到 它的源代码方面, 340 00:16:20,950 --> 00:16:23,270 有一堆的功能 declared--调用getInt,GetString的, 341 00:16:23,270 --> 00:16:26,950 和一帮others--的除非 我们实际上有包括线路, 342 00:16:26,950 --> 00:16:29,320 编译锵不 要知道它的存在。 343 00:16:29,320 --> 00:16:32,400 而且同样适用于线 2其中int定义 344 00:16:32,400 --> 00:16:35,101 printf的,这是一个功能 我们继续使用相当多。 345 00:16:35,101 --> 00:16:37,850 现在,四线似乎有点时髦 因为它只是一个单行。 346 00:16:37,850 --> 00:16:41,570 它有一个分号,没有卷曲 牙套,它里面没有任何代码。 347 00:16:41,570 --> 00:16:44,640 但是,我们才称之为 这件事情在过去的几个星期? 348 00:16:44,640 --> 00:16:45,140 是啊。 349 00:16:45,140 --> 00:16:46,060 因此,一个原型。 350 00:16:46,060 --> 00:16:48,390 为什么我们有一个 原型,这似乎 351 00:16:48,390 --> 00:16:51,050 是有点多余 通常是因为我们平时 352 00:16:51,050 --> 00:16:53,474 再次查看功能 后来在该文件中,对不对? 353 00:16:53,474 --> 00:16:56,390 那么,为什么我们have--你只是 抓你的头,但我会接受它。 354 00:16:56,390 --> 00:16:57,302 是啊。 355 00:16:57,302 --> 00:17:00,000 >> 听众:[听不清] 主后功能。 356 00:17:00,000 --> 00:17:01,000 DAVID J.马兰:没错。 357 00:17:01,000 --> 00:17:04,089 这样编译器知道你 最终确定或实施 358 00:17:04,089 --> 00:17:06,579 之后,主要的功能,大概是。 359 00:17:06,579 --> 00:17:08,462 所以锵最 编译器是一种​​愚蠢的 360 00:17:08,462 --> 00:17:10,510 他们会只知道 你告诉他们。 361 00:17:10,510 --> 00:17:12,569 如果你想使用 一个名为西格玛功能, 362 00:17:12,569 --> 00:17:15,710 你最好教的编译器 它存在于提前。 363 00:17:15,710 --> 00:17:17,970 >> 现在,主本身,甚至 虽然这是一帮行, 364 00:17:17,970 --> 00:17:19,839 是现在非常熟悉的希望。 365 00:17:19,839 --> 00:17:21,942 它有一个do while循环 在生活中,其目的 366 00:17:21,942 --> 00:17:24,400 这里显然是获得一个 从用户正整数。 367 00:17:24,400 --> 00:17:27,349 而只是一味地缠着他 或她,直到他们合作。 368 00:17:27,349 --> 00:17:30,670 随后在第16行我有 一个有趣的电话。 369 00:17:30,670 --> 00:17:31,570 IntAnswer。 370 00:17:31,570 --> 00:17:33,710 这在左手 边给了我一个Int 371 00:17:33,710 --> 00:17:36,650 它可以store--称为Answer-- 这是要以存储,显然, 372 00:17:36,650 --> 00:17:39,090 西格玛的返回值。 373 00:17:39,090 --> 00:17:41,840 所以适马只是一个 任意但有意义的名称 374 00:17:41,840 --> 00:17:44,500 我已经给一个函数 在生活中,其目的 375 00:17:44,500 --> 00:17:47,680 是需要一个argument-- 我们把它叫做N的这个case-- 376 00:17:47,680 --> 00:17:52,280 和刚采取这一数目的总和 再加上每一个正数的 377 00:17:52,280 --> 00:17:53,200 比它小。 378 00:17:53,200 --> 00:17:58,140 >> 所以,如果我通过了2号线到 西格玛,我要加2加1 379 00:17:58,140 --> 00:18:00,240 加上0--不0--这样给我3。 380 00:18:00,240 --> 00:18:05,320 如果我通过在3个西格玛,我想 有3加2加1,这给了我6。 381 00:18:05,320 --> 00:18:05,900 等等。 382 00:18:05,900 --> 00:18:09,750 因此,它只是增加了所有的 数小于或等于它。 383 00:18:09,750 --> 00:18:12,040 >> 现在,到这里我只是去 打印出来的答案。 384 00:18:12,040 --> 00:18:17,330 因此,作为一个快速的完整性检查,让我们 使六西格玛0--点斜线西格玛0-- 385 00:18:17,330 --> 00:18:18,690 并让我在2型。 386 00:18:18,690 --> 00:18:19,960 而我确实拿到3。 387 00:18:19,960 --> 00:18:21,240 让我输入3。 388 00:18:21,240 --> 00:18:22,860 我确实得到6。 389 00:18:22,860 --> 00:18:27,636 如果任何人都可以快速地做数学题, 如果我做50我该怎么弄? 390 00:18:27,636 --> 00:18:29,839 >> 听众:[听不清]。 391 00:18:29,839 --> 00:18:30,880 DAVID J.马兰:哦,不。 392 00:18:30,880 --> 00:18:33,340 但是1275这是非常密切的。 393 00:18:33,340 --> 00:18:38,850 因此,这是在做50的结果 加49加48加47加46 394 00:18:38,850 --> 00:18:40,349 一路下跌至1。 395 00:18:40,349 --> 00:18:41,390 所以这是所有六西格玛一样。 396 00:18:41,390 --> 00:18:43,350 但是,让我们看看怎么样了 现在已经实现了。 397 00:18:43,350 --> 00:18:45,790 所以到这里是函数本身。 398 00:18:45,790 --> 00:18:49,000 而这似乎并不有 任何与递归呢。 399 00:18:49,000 --> 00:18:51,070 事实上,我们正在使用 老派技术。 400 00:18:51,070 --> 00:18:56,680 我初始化的变量称为总和 到零,然后我有一个foreloop在这里, 401 00:18:56,680 --> 00:19:00,790 而我所谓的声明一个Int 我,将其设置等于1-- 402 00:19:00,790 --> 00:19:04,080 虽然我可以将其设置为 零,但由于我在做加法, 403 00:19:04,080 --> 00:19:05,340 谁在乎,如果是0或1。 404 00:19:05,340 --> 00:19:06,660 这将没有任何效果。 405 00:19:06,660 --> 00:19:10,110 >> 所以我迭代,​​只要我是 小于或等于m,其中 406 00:19:10,110 --> 00:19:11,671 是传入的参数。 407 00:19:11,671 --> 00:19:13,670 然后,我只是不停 一,增量和Insight 408 00:19:13,670 --> 00:19:20,010 循环的所有我做的是做总和 加等于一,这就是故意的。 409 00:19:20,010 --> 00:19:22,326 我并不想这样做,在这 情况下,像总和加上加。 410 00:19:22,326 --> 00:19:24,790 我想实际添加 I的电流值 411 00:19:24,790 --> 00:19:28,190 这使越来越大 做大到正在运行的理货。 412 00:19:28,190 --> 00:19:30,210 >> 然后我返回总和。 413 00:19:30,210 --> 00:19:33,850 所以回答得的价值总和。 414 00:19:33,850 --> 00:19:35,282 然后,我把它打印出来。 415 00:19:35,282 --> 00:19:37,740 因此,有一个机会,在这里, 虽然,那种简化 416 00:19:37,740 --> 00:19:41,260 这段代码概念 而那种打击一个人的 417 00:19:41,260 --> 00:19:43,250 介意条款 简单,即使它 418 00:19:43,250 --> 00:19:45,700 需要一段时间来排序 中明白为什么这 419 00:19:45,700 --> 00:19:47,330 就是在这些小例子强大。 420 00:19:47,330 --> 00:19:50,380 这里是西格玛埃德蒙顿所以 第二个版本的代码。 421 00:19:50,380 --> 00:19:55,290 一切都往上顶是相同的,从而 同样的故事,适用于前。 422 00:19:55,290 --> 00:19:59,220 但是,现在让我们来看看 实施六西格玛的哪些 423 00:19:59,220 --> 00:20:05,040 我已经削减到只有这 lines--四行代码,真的, 424 00:20:05,040 --> 00:20:06,980 再加上一些大括号和空白。 425 00:20:06,980 --> 00:20:07,930 >> 但是我在做什么? 426 00:20:07,930 --> 00:20:11,050 如果m小于或等于 零,我需要那种处理 427 00:20:11,050 --> 00:20:12,490 该超级简单的情况。 428 00:20:12,490 --> 00:20:15,450 如果你把我零或任何东西 负这只是奇怪, 429 00:20:15,450 --> 00:20:17,909 我只是随意 但始终返回零。 430 00:20:17,909 --> 00:20:20,200 我不希望这件事 进入一些奇怪的无限 431 00:20:20,200 --> 00:20:21,810 因为负值循环。 432 00:20:21,810 --> 00:20:25,070 所以,我只是说,如果你给我 小于或等于0,我回零。 433 00:20:25,070 --> 00:20:28,220 >> 但是,这是好事,因为这是 电话簿中的单页 434 00:20:28,220 --> 00:20:28,790 剩下的。 435 00:20:28,790 --> 00:20:32,660 我咬过一个很具体的问题, 并没有要求什么递归。 436 00:20:32,660 --> 00:20:36,580 但在第31行,什么 我似乎是在做什么? 437 00:20:36,580 --> 00:20:39,780 括号只是保持 事情,希望更清晰一点。 438 00:20:39,780 --> 00:20:42,110 但是,所有我做的是我 返回M--什么 439 00:20:42,110 --> 00:20:45,790 你的手我 - 加 M--遗憾的价值, 440 00:20:45,790 --> 00:20:49,052 加为m减1西格玛的价值。 441 00:20:49,052 --> 00:20:50,010 所以,这是什么意思? 442 00:20:50,010 --> 00:20:53,965 如果你给我3号作为输入, 答案我想获得最终 443 00:20:53,965 --> 00:20:57,307 6,因为3加2加1给了我6。 444 00:20:57,307 --> 00:20:59,390 但我怎么想 如何代码运行? 445 00:20:59,390 --> 00:21:03,070 我第一次打电话西格玛 我传递值3, 446 00:21:03,070 --> 00:21:07,960 这等于是说了一块 纸,这里的值3 447 00:21:07,960 --> 00:21:09,920 我一直在传递这是西格玛。 448 00:21:09,920 --> 00:21:13,090 显然3不小于0,所以 IF条件不适用。 449 00:21:13,090 --> 00:21:14,020 的人这样做。 450 00:21:14,020 --> 00:21:14,990 所以,我该怎么办? 451 00:21:14,990 --> 00:21:19,902 我想回到米,这是 3,加西格玛为m减1。 452 00:21:19,902 --> 00:21:21,110 因此,让我跟踪了这​​一点。 453 00:21:21,110 --> 00:21:22,710 我打算把这个 一张纸了。 454 00:21:22,710 --> 00:21:24,668 而什么样的价值,是 清晰的,我是要通过 455 00:21:24,668 --> 00:21:26,540 进入适马在这一点上的故事? 456 00:21:26,540 --> 00:21:28,080 什么号码? 457 00:21:28,080 --> 00:21:28,610 2,对不对? 458 00:21:28,610 --> 00:21:29,670 3减1,2。 459 00:21:29,670 --> 00:21:32,000 所以,我只是需要一点点 纸片在这里。 460 00:21:32,000 --> 00:21:33,931 所以,现在西格玛是越来越再次调用。 461 00:21:33,931 --> 00:21:35,930 我也故意放 下来,因为它是 462 00:21:35,930 --> 00:21:38,070 有点像暂停 该版本的故事 463 00:21:38,070 --> 00:21:40,720 因为现在我专注 对m的减1的信号。 464 00:21:40,720 --> 00:21:42,660 因此,M的3,M减1,2。 465 00:21:42,660 --> 00:21:45,110 因此,这里是2,我已经通过了。 466 00:21:45,110 --> 00:21:48,510 2显然是不小于 0,这样的情况下不适用。 467 00:21:48,510 --> 00:21:53,445 否则我回到米,这是这个 的事情,再加上西格玛还有什么价值呢? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 因此,如果1--的西格玛因为m是 现在2 SO 2减1为1。 470 00:21:59,650 --> 00:22:01,950 所以,现在我只值1。 471 00:22:01,950 --> 00:22:04,810 我只是路过的数量 1到函数sigma-- 472 00:22:04,810 --> 00:22:09,120 还是我自己这里 - 所以1显然是不 小于零,仍然不适用。 473 00:22:09,120 --> 00:22:12,970 >> 否则返回1加什么西格玛? 474 00:22:12,970 --> 00:22:13,470 0。 475 00:22:13,470 --> 00:22:14,678 因此,让我只记得。 476 00:22:14,678 --> 00:22:15,920 我会回来以后。 477 00:22:15,920 --> 00:22:18,060 现在我要继续前进,并记 向下数0,因为这是 478 00:22:18,060 --> 00:22:19,470 我的论点或参数。 479 00:22:19,470 --> 00:22:22,400 我顺利通过了数0 最后这个过程 480 00:22:22,400 --> 00:22:25,760 只是重复自己的广告 nauseum不会停止,因为什么 481 00:22:25,760 --> 00:22:28,820 我马上做一次,我看到这个0? 482 00:22:28,820 --> 00:22:29,790 我回零。 483 00:22:29,790 --> 00:22:31,790 所以,现在你必须倒回的故事。 484 00:22:31,790 --> 00:22:34,430 >> 如果我现在往回走的时候, 什么是最近的事 485 00:22:34,430 --> 00:22:36,670 我做了,如果你是从字面上 倒带视频? 486 00:22:36,670 --> 00:22:41,630 我要拿起最新的 1这给了我1加0就是1。 487 00:22:41,630 --> 00:22:44,100 如果我继续倒带 故事,那将会给我 488 00:22:44,100 --> 00:22:46,880 2加上该运行值,这是1。 489 00:22:46,880 --> 00:22:47,789 所以这是3。 490 00:22:47,789 --> 00:22:49,330 然后,我会继续后退。 491 00:22:49,330 --> 00:22:54,220 当我第一次放下数量 3--所以3 + 3给了我6。 492 00:22:54,220 --> 00:22:57,272 >> 而现在,如果你倒带 视频,直到这一点, 493 00:22:57,272 --> 00:22:58,980 这是很 第一个问题我问。 494 00:22:58,980 --> 00:23:01,450 当传递3,什么是3西格玛? 495 00:23:01,450 --> 00:23:04,204 它们也确实6的总和 所有这些纸片。 496 00:23:04,204 --> 00:23:07,120 因此,如果这需要一点时间来 包装你的头脑围绕,这很好。 497 00:23:07,120 --> 00:23:10,700 但认为这是一个little--它 是非常谨慎的,我叠 498 00:23:10,700 --> 00:23:12,990 在彼此的顶部,这些数字。 499 00:23:12,990 --> 00:23:17,440 这有点像有一个 memory--创纪录的时间, 500 00:23:17,440 --> 00:23:19,940 像在视频洗涤器, 我的确可以倒带研究。 501 00:23:19,940 --> 00:23:24,350 而且我们要回来 隐喻的只是一点点。 502 00:23:24,350 --> 00:23:28,240 >> 但首先,事实证明,有 很多爱好者和有趣的人, 503 00:23:28,240 --> 00:23:29,614 我想,在谷歌。 504 00:23:29,614 --> 00:23:31,530 会有人谁是非常 擅长谷歌搜索的头脑 505 00:23:31,530 --> 00:23:34,270 上来就一会儿和 帮我寻找的东西? 506 00:23:34,270 --> 00:23:35,650 非常,非常低调。 507 00:23:35,650 --> 00:23:37,870 有人谁是从来没有 来之前,也许吧。 508 00:23:37,870 --> 00:23:38,370 行。 509 00:23:38,370 --> 00:23:39,030 是吗? 510 00:23:39,030 --> 00:23:39,530 来吧。 511 00:23:39,530 --> 00:23:41,410 下来吧。 512 00:23:41,410 --> 00:23:42,183 你叫什么名字? 513 00:23:42,183 --> 00:23:42,870 >> SAM:山姆。 514 00:23:42,870 --> 00:23:44,290 >> DAVID J.马兰:萨姆,下来吧。 515 00:23:44,290 --> 00:23:45,320 这是相同的。 516 00:23:45,320 --> 00:23:46,280 很高兴认识你。 517 00:23:46,280 --> 00:23:46,780 嘿。 518 00:23:46,780 --> 00:23:47,580 你过来吧。 519 00:23:47,580 --> 00:23:51,290 所以,我需要你做,如果 你可以,山姆,这里是谷歌。 520 00:23:51,290 --> 00:23:53,240 您可以搜索术语递归? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 不要糟蹋。 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> 现在let's--是的。 525 00:24:00,970 --> 00:24:03,380 单击OK了。 526 00:24:03,380 --> 00:24:04,315 更好单击。 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 啊,明白这一点。 529 00:24:08,020 --> 00:24:08,520 没有? 530 00:24:08,520 --> 00:24:09,050 行。 531 00:24:09,050 --> 00:24:10,430 因此,让我们做一对夫妇的人。 532 00:24:10,430 --> 00:24:12,830 与其说相关 学术在这里,但你 533 00:24:12,830 --> 00:24:14,520 曾经搜查谷歌的字谜? 534 00:24:14,520 --> 00:24:15,280 >> SAM:第 535 00:24:15,280 --> 00:24:15,520 >> DAVID J.马兰:OK。 536 00:24:15,520 --> 00:24:17,186 搜索字谜,而不是递归。 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 怎么样歪斜。 539 00:24:23,790 --> 00:24:25,515 你有没有搜索歪? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 现在,这个有点困难 见但希望everything's--确定。 542 00:24:32,692 --> 00:24:34,150 这只是你和我享受这个。 543 00:24:34,150 --> 00:24:34,690 行。 544 00:24:34,690 --> 00:24:38,950 >> 那么最后,这个one's-- 这是一个有点歪。 545 00:24:38,950 --> 00:24:40,810 现在做一个桶滚。 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 太好了。 548 00:24:45,310 --> 00:24:45,910 好吧。 549 00:24:45,910 --> 00:24:47,110 非常感谢萨姆。 550 00:24:47,110 --> 00:24:49,416 干得好。 551 00:24:49,416 --> 00:24:50,400 谢谢。 552 00:24:50,400 --> 00:24:52,807 >> 那么是什么在所有事情 这些愚蠢的例子吗? 553 00:24:52,807 --> 00:24:55,640 因此,其实,引擎盖下 谷歌的数百万行代码 554 00:24:55,640 --> 00:24:58,860 显然是一些愚蠢的IF 这本质上是条件 555 00:24:58,860 --> 00:25:01,160 检查用户是否具有 键入这句话, 556 00:25:01,160 --> 00:25:03,760 做一些事情,大概花了 时间的非平凡量 557 00:25:03,760 --> 00:25:06,080 实施只是为了 有趣的是这种方式。 558 00:25:06,080 --> 00:25:08,430 但是,这一切都沸腾 向下至罩下方。 559 00:25:08,430 --> 00:25:11,570 但是,当然,递归 更的更老派 560 00:25:11,570 --> 00:25:13,880 例如在那些特殊的技巧。 561 00:25:13,880 --> 00:25:16,880 而且肯定有其他人在那里 同时,我们也许甚至还没有 562 00:25:16,880 --> 00:25:18,230 发现只是还没有。 563 00:25:18,230 --> 00:25:22,830 >> 因此,采取一看,还是考虑 现在下面的程序, 564 00:25:22,830 --> 00:25:24,830 当然抓住任何 这些对你的出路。 565 00:25:24,830 --> 00:25:28,820 我要继续前进, 打开一个程序,是 566 00:25:28,820 --> 00:25:30,920 要尝试交换两个值。 567 00:25:30,920 --> 00:25:33,210 但在此之前,我们去那里,让我们做到这一点。 568 00:25:33,210 --> 00:25:38,500 我们可以多一个获得 志愿者,我觉得呢? 569 00:25:38,500 --> 00:25:40,480 你愿意做志愿者? 570 00:25:40,480 --> 00:25:40,980 没有? 571 00:25:40,980 --> 00:25:41,890 上来吧。 572 00:25:41,890 --> 00:25:42,390 上来吧。 573 00:25:42,390 --> 00:25:42,890 好吧。 574 00:25:42,890 --> 00:25:44,136 所以,你的名字是什么? 575 00:25:44,136 --> 00:25:44,810 >> LAUREN:劳伦。 576 00:25:44,810 --> 00:25:45,768 >> DAVID J.马兰:劳伦。 577 00:25:45,768 --> 00:25:46,890 上来吧,劳伦。 578 00:25:46,890 --> 00:25:50,140 所以劳伦正在 这里的挑战如下。 579 00:25:50,140 --> 00:25:52,310 很高兴认识你。 580 00:25:52,310 --> 00:25:55,730 因此,劳伦在这里有在前面 她的两个空杯子。 581 00:25:55,730 --> 00:25:57,570 而且我们有一些橙色 果汁和一些牛奶 582 00:25:57,570 --> 00:26:00,301 我们打​​算去 进取,做到以下几点。 583 00:26:00,301 --> 00:26:01,550 我们只是要填补这个。 584 00:26:01,550 --> 00:26:07,840 在这里几盎司的牛奶,让我们 补一点橙汁在这里。 585 00:26:07,840 --> 00:26:11,475 >> 而在所有的前 这些观众, 586 00:26:11,475 --> 00:26:13,550 交换这些杯的两个值。 587 00:26:13,550 --> 00:26:16,970 把橙汁中的奶杯 而牛奶中的橙汁杯。 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 你会怎样做,如果你在 家庭和能够获得其他用品? 590 00:26:26,150 --> 00:26:27,400 LAUREN:把它放在另一个杯中。 591 00:26:27,400 --> 00:26:28,191 DAVID J.马兰:OK。 592 00:26:28,191 --> 00:26:31,940 因此,让我们有一个临时的 可变的,如果我们的意愿。 593 00:26:31,940 --> 00:26:35,871 现在继续前进,实现 同样的交换过程。 594 00:26:35,871 --> 00:26:36,370 超好的。 595 00:26:36,370 --> 00:26:41,490 我们已经把OJ到临时 变量,牛奶倒入OJ变量, 596 00:26:41,490 --> 00:26:44,481 现在的临时变量 到牛奶变量。 597 00:26:44,481 --> 00:26:44,980 行。 598 00:26:44,980 --> 00:26:48,740 所以非常好,到目前为止完成的。 599 00:26:48,740 --> 00:26:50,990 因此,原来out--认为, 想了一会儿就好了。 600 00:26:50,990 --> 00:26:54,479 在这里,只是怪胎它了一下,这 将相应的C代码 601 00:26:54,479 --> 00:26:55,520 我们只是执行。 602 00:26:55,520 --> 00:26:58,650 我们有两个输入,a和b,这两个 我们只想说的简单是 603 00:26:58,650 --> 00:26:59,260 廉政局。 604 00:26:59,260 --> 00:27:02,780 并注意在这里,如果我想交换 两个变量,a和b的值, 605 00:27:02,780 --> 00:27:06,890 我们的确需要一个中间人,一 临时变量,暂时杯, 606 00:27:06,890 --> 00:27:10,830 到其中的倾的一个值 因此,我们有一个占位符吧。 607 00:27:10,830 --> 00:27:13,480 但随后的代码正好是 作为劳伦这里实现。 608 00:27:13,480 --> 00:27:15,500 >> 现在,只是为了获得一个 有点疯狂,原来 609 00:27:15,500 --> 00:27:20,930 你可以做到这一点没有 一个临时变量。 610 00:27:20,930 --> 00:27:24,870 要做到这一点正确的,但是,我们要 有骗一些化学反应。 611 00:27:24,870 --> 00:27:26,380 我们这里有一些额外的杯子。 612 00:27:26,380 --> 00:27:29,600 所以最接近看起来 像牛奶和水perhaps-- 613 00:27:29,600 --> 00:27:34,090 或牛奶和OJ--是我们有一些 水,所以我们要填补这一个 614 00:27:34,090 --> 00:27:36,486 有几盎司的清水。 615 00:27:36,486 --> 00:27:38,332 这可能是太多了。 616 00:27:38,332 --> 00:27:38,832 是啊。 617 00:27:38,832 --> 00:27:39,934 这是肯定吃不消。 618 00:27:39,934 --> 00:27:40,600 保持在一秒钟。 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> 而现在我们有油,我记得 初中化学课, 621 00:27:48,420 --> 00:27:49,990 但愿它不会与水混合。 622 00:27:49,990 --> 00:27:53,650 但是,它像是一种 看起来像牛奶和OJ。 623 00:27:53,650 --> 00:27:55,760 所以,现在,无需使用 一个临时变量, 624 00:27:55,760 --> 00:27:59,260 你可以交换这两个值? 625 00:27:59,260 --> 00:28:03,884 因此,油进入水杯, 水进入油杯。 626 00:28:03,884 --> 00:28:04,800 LAUREN:没有其他的杯子? 627 00:28:04,800 --> 00:28:05,940 DAVID J.马兰:没有其他的杯子。 628 00:28:05,940 --> 00:28:07,860 而且我已经不实际 今年前测试这 629 00:28:07,860 --> 00:28:10,110 所以我不知道这是否会 实际工作化学。 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 这是不应该发生的。 632 00:28:18,650 --> 00:28:19,761 难道它的工作? 633 00:28:19,761 --> 00:28:20,260 好吧。 634 00:28:20,260 --> 00:28:20,990 因此,分离? 635 00:28:20,990 --> 00:28:21,490 好。 636 00:28:21,490 --> 00:28:24,714 现在,我们得到得到 水倒入另一个杯子。 637 00:28:24,714 --> 00:28:27,630 智慧的化学浓缩可能 可能做到这一点比我强。 638 00:28:27,630 --> 00:28:28,510 >> LAUREN:水的底部。 639 00:28:28,510 --> 00:28:31,910 >> DAVID J.马兰:这是该water-- 什么是关键的最后一次,我们这样做。 640 00:28:31,910 --> 00:28:33,950 你必须做正确的顺序。 641 00:28:33,950 --> 00:28:34,450 是啊。 642 00:28:34,450 --> 00:28:35,270 没关系。 643 00:28:35,270 --> 00:28:37,290 所以,现在我们有油两杯。 644 00:28:37,290 --> 00:28:37,790 行。 645 00:28:37,790 --> 00:28:38,510 没关系。 646 00:28:38,510 --> 00:28:40,110 但是,化学,如果这工作不是我 - 647 00:28:40,110 --> 00:28:41,200 >> LAUREN:这是水。 648 00:28:41,200 --> 00:28:41,930 >> DAVID J.马兰:这主要是水。 649 00:28:41,930 --> 00:28:42,430 好吧。 650 00:28:42,430 --> 00:28:44,210 但是,这仍然是相同的杯子和以前一样。 651 00:28:44,210 --> 00:28:47,570 所以倒它 - 尝试在那边。 652 00:28:47,570 --> 00:28:49,300 行。 653 00:28:49,300 --> 00:28:51,010 这是一个很好用的上课时间今天。 654 00:28:51,010 --> 00:28:51,510 行。 655 00:28:51,510 --> 00:28:53,890 所以,现在we--不错。 656 00:28:53,890 --> 00:28:55,460 有点。 657 00:28:55,460 --> 00:28:55,960 好吧。 658 00:28:55,960 --> 00:28:56,690 所以非常好。 659 00:28:56,690 --> 00:29:00,006 谢谢劳伦。 660 00:29:00,006 --> 00:29:01,950 非常出色地完成。 661 00:29:01,950 --> 00:29:04,570 >> 所以为了使你的头脑, 这也许是东西 662 00:29:04,570 --> 00:29:08,660 有,如果你喜欢CS50 ID玩, 你可以,事实上,交换两个变量 663 00:29:08,660 --> 00:29:11,470 不使用临时整数。 664 00:29:11,470 --> 00:29:13,060 这是相应的C代码。 665 00:29:13,060 --> 00:29:16,110 如果你从过去的回忆 周三我们介绍了,如果简单地说, 666 00:29:16,110 --> 00:29:19,720 一些新的运营商℃,不 有人回忆一下那个小胡萝卜 667 00:29:19,720 --> 00:29:23,660 符号是,那个小三角 从键盘符号表示? 668 00:29:23,660 --> 00:29:26,003 什么位运算符? 669 00:29:26,003 --> 00:29:26,770 >> 听众:EXOR。 670 00:29:26,770 --> 00:29:27,645 >> DAVID J.马兰:EXOR。 671 00:29:27,645 --> 00:29:28,560 异或。 672 00:29:28,560 --> 00:29:32,920 所以,如果你想,只是为了好玩。 回家,给a和b两个任意 673 00:29:32,920 --> 00:29:36,072 像任何eight--和I值 会选择八位值。 674 00:29:36,072 --> 00:29:38,530 如果你有32位做到这一点, 你会很快感到厌倦。 675 00:29:38,530 --> 00:29:42,150 但是,只要给一个八位 值是什么,一,二, 676 00:29:42,150 --> 00:29:43,790 并给B A类似的价值。 677 00:29:43,790 --> 00:29:46,810 然后使用定义 XOR从上周三, 678 00:29:46,810 --> 00:29:52,560 应用该的点点滴滴,每 那些八位在每个a和b, 679 00:29:52,560 --> 00:29:54,980 然后根据此代码,这样做完全。 680 00:29:54,980 --> 00:29:58,170 而且这不是什么不正确 你在这里看到的屏幕上。 681 00:29:58,170 --> 00:30:02,100 它确实可以归结 三XOR运算 682 00:30:02,100 --> 00:30:05,910 不知何故神奇地一和 b目录都会交换职位 683 00:30:05,910 --> 00:30:08,010 而不丢失任何信息。 684 00:30:08,010 --> 00:30:11,580 >> 因此,油和水的技巧是 最接近真实世界的化身 685 00:30:11,580 --> 00:30:12,980 我能想到的模仿。 686 00:30:12,980 --> 00:30:15,950 但它肯定更容易 使用一个临时变量, 687 00:30:15,950 --> 00:30:16,920 在这里这种情况下。 688 00:30:16,920 --> 00:30:21,190 而这也是一个机会说, 太,这种微优化, 689 00:30:21,190 --> 00:30:23,590 作为一名计算机科学家 可以说,虽然一种乐趣 690 00:30:23,590 --> 00:30:27,060 吹嘘你如何做到这一点没有 像一个额外的变量交换, 691 00:30:27,060 --> 00:30:28,640 这还不是所有的说服力。 692 00:30:28,640 --> 00:30:31,619 由于保存32位,如 在实际的整型的情况下, 693 00:30:31,619 --> 00:30:33,410 是不是所有的吸引力 一个系统,其中上 694 00:30:33,410 --> 00:30:36,722 你可能会使用几十兆 甚至更多的内存等这几天。 695 00:30:36,722 --> 00:30:38,680 而事实上,当我们得到 到后来问题集 696 00:30:38,680 --> 00:30:41,010 而要实现咒语 检查你会 697 00:30:41,010 --> 00:30:43,550 被质疑这样做有 这是小的RAM和尽可能少 698 00:30:43,550 --> 00:30:46,820 时间尽可能的 还是computer--您 699 00:30:46,820 --> 00:30:50,160 有一个星期来实现 它 - 你会have--你会 700 00:30:50,160 --> 00:30:51,799 面临的挑战是减少这些资源。 701 00:30:51,799 --> 00:30:53,840 而这真的是唯一的 时报到本学期 702 00:30:53,840 --> 00:30:57,940 在那里你会被鼓励刮胡子 关闭即使是最优秀的性能 703 00:30:57,940 --> 00:30:59,340 成本并非如此。 704 00:30:59,340 --> 00:31:02,200 >> 那么what--怎样才能 看到这样的实际代码? 705 00:31:02,200 --> 00:31:04,530 现在让我继续前进 并开辟一个例子 706 00:31:04,530 --> 00:31:07,700 故意叫 没有交换,因为它不 707 00:31:07,700 --> 00:31:10,670 其实交换变量 因为你实际上可能期望。 708 00:31:10,670 --> 00:31:12,260 因此,让我们一起来看看。 709 00:31:12,260 --> 00:31:17,050 这里有一个程序,没有CS50 库回事,只是标准的I / O。 710 00:31:17,050 --> 00:31:19,560 现在我们有一个原型 用于交换往上顶刚刚 711 00:31:19,560 --> 00:31:21,540 意味着它一定是在后面定义。 712 00:31:21,540 --> 00:31:22,550 而这里的主力。 713 00:31:22,550 --> 00:31:26,000 >> 我任意分配x和y, 分别值之一和两个 714 00:31:26,000 --> 00:31:28,590 只是因为他们是小 易去想。 715 00:31:28,590 --> 00:31:32,280 然后,我只是有一堆用printfs的 在那里我有一个全面的检查。 x是1 716 00:31:32,280 --> 00:31:35,110 y是2大概是 什么样的printfs输出会说。 717 00:31:35,110 --> 00:31:36,530 因此,没有魔法迄今。 718 00:31:36,530 --> 00:31:40,100 >> 然后,我要索赔 打印清晰度,交换点点点。 719 00:31:40,100 --> 00:31:43,730 我会打电话给交换 功能,通过在x和y。 720 00:31:43,730 --> 00:31:47,350 而且,我们现在假设 掉期完全实现 721 00:31:47,350 --> 00:31:49,930 因为这是一个时刻前 用临时变量。 722 00:31:49,930 --> 00:31:52,670 所以我要求大胆,调换。 723 00:31:52,670 --> 00:31:55,429 x是现在这个y是现在。 724 00:31:55,429 --> 00:31:57,220 但该文件,当然, 被称为没有交换。 725 00:31:57,220 --> 00:31:58,678 因此,让我们其实看看会发生什么。 726 00:31:58,678 --> 00:32:04,450 如果我编译没有交换,然后 做./noswap,x是1,y是2。 727 00:32:04,450 --> 00:32:05,770 交换交换。 728 00:32:05,770 --> 00:32:07,200 x是1,y是2。 729 00:32:07,200 --> 00:32:11,980 因此,它实际上似乎是,即使有缺陷 虽然swap--让我们向下滚动now-- 730 00:32:11,980 --> 00:32:16,542 是按照完全实现 代码我刚才提出的。 731 00:32:16,542 --> 00:32:19,000 所以我们不会获得幻想 与XOR的东西现在。 732 00:32:19,000 --> 00:32:21,890 这也正常吧 像牛奶和OJ, 733 00:32:21,890 --> 00:32:25,820 但它似乎并不奏效。 734 00:32:25,820 --> 00:32:27,180 >> 因此,让我们再次做到这一点。 735 00:32:27,180 --> 00:32:29,310 也许我只是不运行它的权利。 736 00:32:29,310 --> 00:32:32,010 因此,让我们再次运行没有交换。 737 00:32:32,010 --> 00:32:32,900 或许我 - 没有。 738 00:32:32,900 --> 00:32:34,400 所以它只是不工作。 739 00:32:34,400 --> 00:32:36,060 因此,让我们做一个小的完整性检查。 740 00:32:36,060 --> 00:32:39,690 让我在这里交换继续 并且只需添加,等待一分钟, 741 00:32:39,690 --> 00:32:43,856 一个是%I / N,让我们 插件的一个的值。 742 00:32:43,856 --> 00:32:45,730 因为我真的想 看看发生了什么事情。 743 00:32:45,730 --> 00:32:47,570 事实上,这是 调试技术 744 00:32:47,570 --> 00:32:50,028 你可能会使用 办公时间或在家已经, 745 00:32:50,028 --> 00:32:53,560 类似于第一丹的一半 Armendariz环的视频在PSET3 746 00:32:53,560 --> 00:32:56,870 其中,我们介绍了打印清晰度为 推荐的技术中,至少 747 00:32:56,870 --> 00:32:58,080 对于简单的情况。 748 00:32:58,080 --> 00:33:01,720 让我继续前进,运行make 再没有交换,./noswap。 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> 有趣的。 751 00:33:05,840 --> 00:33:11,670 所以,注意什么似乎是正确的。 x 为1,y是2,但a为2时b为1。 752 00:33:11,670 --> 00:33:16,790 因此,这两个不知何故交换 但x和y是没有得到交​​换。 753 00:33:16,790 --> 00:33:21,090 所以要清楚,发生了什么 是,在这里我有X和Y 754 00:33:21,090 --> 00:33:25,380 而这些都是局部变量,在 主要适用范围,我传递的x和y 755 00:33:25,380 --> 00:33:26,170 互换。 756 00:33:26,170 --> 00:33:29,080 现在,掉期,作为一个单独的功能, 可以自由地调用它的参数 757 00:33:29,080 --> 00:33:30,590 或者它的参数什么就是了。 758 00:33:30,590 --> 00:33:33,280 富或酒吧或x或y或a或b。 759 00:33:33,280 --> 00:33:36,870 只是为了清楚,他们是 不相同的x和y本身 760 00:33:36,870 --> 00:33:38,020 我已经说过了a和b。 761 00:33:38,020 --> 00:33:40,040 但是,我们可以打电话给他们任何我们想要的。 762 00:33:40,040 --> 00:33:43,960 >> 所以它看起来像 交换被传递 763 00:33:43,960 --> 00:33:48,980 x-- AKA A--和它的 传递y-- AKA湾 764 00:33:48,980 --> 00:33:51,900 不知怎的,这三条线都 正是这些交换价值 765 00:33:51,900 --> 00:33:53,510 作为劳伦就与牛奶和OJ。 766 00:33:53,510 --> 00:33:56,010 但是,当我们打印出 的值,a和b 767 00:33:56,010 --> 00:34:01,340 的确交换,但X和 y的不改变它们。 768 00:34:01,340 --> 00:34:03,150 回想一下,x和y是在这里。 769 00:34:03,150 --> 00:34:05,320 >> 因此,我们可以通过看这 另一种技术为好。 770 00:34:05,320 --> 00:34:08,110 而这也是一个技术 嵌入在问题设定了三个。 771 00:34:08,110 --> 00:34:10,780 让我们继续前进,并为此在 CS50 ID,如果你还没有。 772 00:34:10,780 --> 00:34:13,730 在右侧我们 有这样的调试器选项卡。 773 00:34:13,730 --> 00:34:16,159 如果你打开​​这个了, 有一些神秘的信息 774 00:34:16,159 --> 00:34:17,530 多数民众赞成在投掷您最初。 775 00:34:17,530 --> 00:34:19,310 但是,让我们取笑这除了真正的快。 776 00:34:19,310 --> 00:34:21,620 >> 所以一个,你看到的局部变量。 777 00:34:21,620 --> 00:34:26,230 原来,打造成为CS50 IDE和 很多编程环境的更多 778 00:34:26,230 --> 00:34:28,060 一般是一个调试器。 779 00:34:28,060 --> 00:34:31,340 一种工具,可以让你直观地看到 什么是你的节目里面发生 780 00:34:31,340 --> 00:34:34,380 而不必诉诸于添加 printfs输出和编译并运行 781 00:34:34,380 --> 00:34:37,588 和添加的printf的,编制和 运行时,它已经在办公时间 782 00:34:37,588 --> 00:34:40,070 或家庭,大概是 越来越漂亮乏味。 783 00:34:40,070 --> 00:34:43,090 >> 所以在这里,在短短的时刻,我们 要看到的实时 784 00:34:43,090 --> 00:34:44,760 我们的局部变量的值。 785 00:34:44,760 --> 00:34:47,880 我们也将能够设置 所谓的断点这 786 00:34:47,880 --> 00:34:52,570 有机会在我的计划暂停 执行在特定的代码行 787 00:34:52,570 --> 00:34:53,710 我很好奇。 788 00:34:53,710 --> 00:34:54,210 对? 789 00:34:54,210 --> 00:34:55,969 这些方案在瞬间运行。 790 00:34:55,969 --> 00:35:00,450 它是一种很好的为我们人类更慢 要能够暂停,花一点时间,看看 791 00:35:00,450 --> 00:35:02,380 什么是围绕回事 一定行的代码 792 00:35:02,380 --> 00:35:05,050 没有程序耕翻 通过它,完成全部。 793 00:35:05,050 --> 00:35:08,510 因此,一个断点将允许我们 打破和暂停在某一点。 794 00:35:08,510 --> 00:35:12,990 >> 调用堆栈是一个奇特的方式 说功能是什么目前 795 00:35:12,990 --> 00:35:14,140 被调用的时刻。 796 00:35:14,140 --> 00:35:15,370 主总是首先调用。 797 00:35:15,370 --> 00:35:17,230 但是,如果主调用 函数称为交换, 798 00:35:17,230 --> 00:35:20,470 我们真的要看到这 塔的功能,已 799 00:35:20,470 --> 00:35:22,400 所谓逆时间顺序。 800 00:35:22,400 --> 00:35:23,310 因此,让我们看到这一点。 801 00:35:23,310 --> 00:35:24,327 >> 我要缩小。 802 00:35:24,327 --> 00:35:25,660 我要回到我的代码。 803 00:35:25,660 --> 00:35:27,540 而只是因为我想 这里是迂腐, 804 00:35:27,540 --> 00:35:31,100 我要继续前进,然后点击 只是五号线的左侧。 805 00:35:31,100 --> 00:35:32,830 这创建了一个红点。 806 00:35:32,830 --> 00:35:36,200 并注意在右手侧 调试器知道,哎, 807 00:35:36,200 --> 00:35:41,020 我刚才说了一个断点 noswap.c五号线,特别是 808 00:35:41,020 --> 00:35:42,480 在这行代码。 809 00:35:42,480 --> 00:35:45,090 因此,调试器知道我 有请下一次 810 00:35:45,090 --> 00:35:48,530 我跑我的程序就暂停 在此执行,而不是仅仅 811 00:35:48,530 --> 00:35:50,390 运行整个事情的超级快。 812 00:35:50,390 --> 00:35:53,889 >> 所以,现在我要点击调试 在IDE的顶部按钮 813 00:35:53,889 --> 00:35:55,430 而这要做到以下几点。 814 00:35:55,430 --> 00:36:00,680 这将打开一个最初有点 可怕看第二终端window-- 815 00:36:00,680 --> 00:36:02,679 从远程调试 举办​​这样和such-- 816 00:36:02,679 --> 00:36:04,970 我们会回来的是什么 所有这意味着不久。 817 00:36:04,970 --> 00:36:09,020 但是,什么是重要的,现在 是那个红点被击中, 818 00:36:09,020 --> 00:36:11,735 调试器具有故意 暂停execution-- 819 00:36:11,735 --> 00:36:15,560 不是本身该行,但是,从第一 线的在该函数中的实际代码。 820 00:36:15,560 --> 00:36:18,040 这就是为什么七号线是 现在,以黄色突出显示。 821 00:36:18,040 --> 00:36:20,550 >> 现在,让我们来看看 在右手侧。 822 00:36:20,550 --> 00:36:27,300 它看起来像,在默认情况下, 好听的是,x具有什么价值? 823 00:36:27,300 --> 00:36:27,860 0。 824 00:36:27,860 --> 00:36:29,750 和Y有什么价值? 825 00:36:29,750 --> 00:36:30,410 零。 826 00:36:30,410 --> 00:36:35,540 这是可以预料的意义 x和y--的黄色line--有 827 00:36:35,540 --> 00:36:36,770 还没有执行。 828 00:36:36,770 --> 00:36:38,510 的SO x不应该具有值1。 829 00:36:38,510 --> 00:36:41,470 它可能具有任何其他值, 所谓的垃圾值。 830 00:36:41,470 --> 00:36:44,320 我们很幸运,因为它是 在这一点上为零,基本上是。 831 00:36:44,320 --> 00:36:46,400 >> 所以,现在这里只有少数 按钮,我们需要照顾 832 00:36:46,400 --> 00:36:48,100 关于这种方式调试时。 833 00:36:48,100 --> 00:36:49,970 请注意,在这里,我们有一个播放按钮。 834 00:36:49,970 --> 00:36:51,877 如果我们发挥,或打 恢复,这只是 835 00:36:51,877 --> 00:36:53,710 经过运行 该程序的其余部分 836 00:36:53,710 --> 00:36:55,300 或者直到遇到另一个断点。 837 00:36:55,300 --> 00:36:56,910 但我没有设置任何其他 断点所以它只是 838 00:36:56,910 --> 00:36:58,118 经过运行结束。 839 00:36:58,118 --> 00:37:00,280 那种连败的 闲逛的目的。 840 00:37:00,280 --> 00:37:03,290 >> 所以,相反,我很在乎 这些图标右侧。 841 00:37:03,290 --> 00:37:05,360 如果我将鼠标悬停在 他们,你也应该这么做, 842 00:37:05,360 --> 00:37:07,450 你会看到小tips--工具提示。 843 00:37:07,450 --> 00:37:09,020 这一个是步过。 844 00:37:09,020 --> 00:37:11,290 现在,这并不意味着跳跃 下面的一行代码。 845 00:37:11,290 --> 00:37:14,840 这只是意味着执行它, 移动到下一个,移动到下一个, 846 00:37:14,840 --> 00:37:15,580 移动到下一个。 847 00:37:15,580 --> 00:37:17,610 换句话说,通过 那个按钮,我可以走 848 00:37:17,610 --> 00:37:20,390 通过我的代码,一步一个脚印的时间。 849 00:37:20,390 --> 00:37:21,914 逐行逐字地。 850 00:37:21,914 --> 00:37:23,830 现在,到右侧 这,还有另外一个 851 00:37:23,830 --> 00:37:25,163 我们会看到在短短的时刻。 852 00:37:25,163 --> 00:37:27,820 这就是所谓的 步入图标的 853 00:37:27,820 --> 00:37:30,300 要允许我潜水 成另一种功能。 854 00:37:30,300 --> 00:37:31,800 但是,让我们来看看在短短的时刻。 855 00:37:31,800 --> 00:37:33,280 所以,我要点击跳过。 856 00:37:33,280 --> 00:37:35,820 而现在发现,我点击 这个按钮在右上角, 857 00:37:35,820 --> 00:37:41,260 保持你的眼睛大致在本地 变量和看看会发生到x什么。 858 00:37:41,260 --> 00:37:44,115 x是现在的1,因为 黄线目前已执行 859 00:37:44,115 --> 00:37:45,840 我们已经转移到8号线。 860 00:37:45,840 --> 00:37:49,840 而在短短的一瞬间ÿ 应该有希望成为2。 861 00:37:49,840 --> 00:37:52,330 >> 现在,没有什么有趣 发生了一点。 862 00:37:52,330 --> 00:37:53,390 这一切是printf的。 863 00:37:53,390 --> 00:37:58,010 同时注意,在我的副终端 窗口,我看到打印高清输出。 864 00:37:58,010 --> 00:38:01,080 而现在我必须做出一个 决定程序员。 865 00:38:01,080 --> 00:38:04,360 我能跨过这条线的 代码执行,但不 866 00:38:04,360 --> 00:38:06,220 越来越好奇里面有什么。 867 00:38:06,220 --> 00:38:11,130 或者,我可以真正踏进去 去交换本身的内部。 868 00:38:11,130 --> 00:38:12,340 因此,让我们做后者。 869 00:38:12,340 --> 00:38:15,550 >> 让我继续前进,点击 不踩过去,但步入。 870 00:38:15,550 --> 00:38:17,300 请注意,突然 窗口变化 871 00:38:17,300 --> 00:38:19,330 以突出所述第一 线的交换代码。 872 00:38:19,330 --> 00:38:20,710 这是第21行。 873 00:38:20,710 --> 00:38:25,220 而现在,有什么样的时髦的是, 如果你看过来,符合市场预期, 874 00:38:25,220 --> 00:38:29,720 逗号b为1和2。 875 00:38:29,720 --> 00:38:33,840 为什么是临时32,767? 876 00:38:33,840 --> 00:38:36,560 回顾温度,很像 空杯刚才, 877 00:38:36,560 --> 00:38:38,980 这里宣布第21行。 878 00:38:38,980 --> 00:38:43,390 为什么32,000-我的意思是,这是为什么 它只是一些奇怪的值? 879 00:38:43,390 --> 00:38:43,890 是吗? 880 00:38:43,890 --> 00:38:45,190 >> 听众:这不是初始化。 881 00:38:45,190 --> 00:38:46,940 >> DAVID J.马兰:这是 未被初始化。 882 00:38:46,940 --> 00:38:49,370 因此,我们的电脑总是 有物理内存。 883 00:38:49,370 --> 00:38:50,544 它总是有物理RAM。 884 00:38:50,544 --> 00:38:52,710 而总有为零的 和一个人在那里,对不对? 885 00:38:52,710 --> 00:38:54,626 因为我们使用我们的 计算机整天, 886 00:38:54,626 --> 00:38:57,210 您使用的是CS50 IDE 或服务器整天。 887 00:38:57,210 --> 00:39:01,159 这样RAM或者有一些零或 有些人的或者一些零和一。 888 00:39:01,159 --> 00:39:02,950 不管是否 不是你使用它们。 889 00:39:02,950 --> 00:39:05,270 你不能只是有空白 空间,您要位。 890 00:39:05,270 --> 00:39:06,850 他们要么零和一。 891 00:39:06,850 --> 00:39:09,610 >> 所以,事实证明,临时的,因为 我们没有初始化它, 892 00:39:09,610 --> 00:39:14,580 我们这些32位,但他们还没有 被初始化到任何已知的值。 893 00:39:14,580 --> 00:39:18,110 所以,无论他们是最 最近使用for--的32 bits-- 894 00:39:18,110 --> 00:39:23,000 我们只是看到一些文物 以前使用这些特定的32 895 00:39:23,000 --> 00:39:23,500 位。 896 00:39:23,500 --> 00:39:27,780 当我点击步过,虽然, 唷,温度将会获得价值1。 897 00:39:27,780 --> 00:39:31,600 如果我再这样做,一个是 将要给出的值2 898 00:39:31,600 --> 00:39:33,830 然后b为要 被赋予值1。 899 00:39:33,830 --> 00:39:36,390 >> 还等什么高兴现在 这点在故事 900 00:39:36,390 --> 00:39:39,750 是调试器是 给我看,超级慢 901 00:39:39,750 --> 00:39:42,640 在我自己的节奏,有什么 交换的状态。 902 00:39:42,640 --> 00:39:47,490 但是请注意,在这里的顶部,通知 该调用堆栈实际上 903 00:39:47,490 --> 00:39:49,180 有两层到它。 904 00:39:49,180 --> 00:39:53,240 现在,这突出显示为一 交换,如果我在主营点击相反, 905 00:39:53,240 --> 00:39:57,100 注意局部变量如何变化 因为开发人员可以只跳 906 00:39:57,100 --> 00:39:59,740 各地去到任何不同的范围。 907 00:39:59,740 --> 00:40:04,070 因此,即使我们正在做这一切 工作,并正确地交换a和b, 908 00:40:04,070 --> 00:40:09,080 如果我去来回交换之间 其中a是2,b是1和主, 909 00:40:09,080 --> 00:40:11,851 一直主要受到影响呢? 910 00:40:11,851 --> 00:40:12,350 第 911 00:40:12,350 --> 00:40:13,930 那么,有什么外卖吗? 912 00:40:13,930 --> 00:40:18,200 嗯,事实证明,任何时候 你调用一个函数像交换, 913 00:40:18,200 --> 00:40:21,600 你通过它的参数,是什么 你传递的交换功能 914 00:40:21,600 --> 00:40:24,730 在这种情况下是一个拷贝 这些论点。 915 00:40:24,730 --> 00:40:28,620 因此,如果x和y分别是每个 32位,什么交换也越来越 916 00:40:28,620 --> 00:40:30,760 是两个新的地方 变量或参数, 917 00:40:30,760 --> 00:40:34,380 称为一个和b--但这些都是任意的 names--但是零点的图案 918 00:40:34,380 --> 00:40:39,520 和1的内部a和b是 排队是相同的x和y 919 00:40:39,520 --> 00:40:42,610 但它们不是 同样的事情,x和y。 920 00:40:42,610 --> 00:40:46,880 >> 就好像主在其片 纸张的数量1和2为x和y, 921 00:40:46,880 --> 00:40:49,260 然后当它手中那 一张纸来交换, 922 00:40:49,260 --> 00:40:51,970 交换非常快变 自己的笔,记 923 00:40:51,970 --> 00:40:56,240 图1和2自身的纸片 手回原来的XY主 924 00:40:56,240 --> 00:40:58,790 然后做自己的 与a和b的事情。 925 00:40:58,790 --> 00:41:01,940 这是因为现在的超级重要 这有平凡的意义 926 00:41:01,940 --> 00:41:06,260 对于实际编写正确的代码 因为它似乎我们不能互换 927 00:41:06,260 --> 00:41:07,500 两个变量。 928 00:41:07,500 --> 00:41:09,150 >> 我写了一个正确的交换功能。 929 00:41:09,150 --> 00:41:12,770 我们与劳伦实现了它作为 正确的交换功能,在现实中, 930 00:41:12,770 --> 00:41:16,700 但显然没有了 如果事情你不能真正 931 00:41:16,700 --> 00:41:19,530 交换两个值永久。 932 00:41:19,530 --> 00:41:21,970 因此,我们需要另一种方式 真正得到这个, 933 00:41:21,970 --> 00:41:24,472 我们需要能够 实际上解决这个问题。 934 00:41:24,472 --> 00:41:27,180 而事实证明out--,我们会来 回到这个特定图片 935 00:41:27,180 --> 00:41:30,500 long--之前,这是一种方式 你可以画出你的计算机的内存。 936 00:41:30,500 --> 00:41:31,460 这只是一个矩形。 937 00:41:31,460 --> 00:41:32,960 你可以任意绘制 的方式,但它的数量 938 00:41:32,960 --> 00:41:35,740 先画出它作为 矩形的理由如下。 939 00:41:35,740 --> 00:41:40,040 >> 我们要开始今天及以后 谈到所谓的栈。 940 00:41:40,040 --> 00:41:43,870 且堆栈只是一大块 的RAM-- memory--的一大块 941 00:41:43,870 --> 00:41:47,100 该功能可访问 当他们是所谓的。 942 00:41:47,100 --> 00:41:49,800 所以,事实证明,在 这个堆栈的底部 943 00:41:49,800 --> 00:41:53,590 是所有主要的局部变量 和org C和有机V和所有的东西 944 00:41:53,590 --> 00:41:56,950 是要去默认。如果主 调用其他一些功能像掉期, 945 00:41:56,950 --> 00:42:00,330 同时,交换是会得到另一个 层的上面记忆起来。 946 00:42:00,330 --> 00:42:04,490 >> 所以只给你一个快速粗略 这个画面,如果我去了这里 - 947 00:42:04,490 --> 00:42:09,450 让我这反映在 开销well--真正让我有, 948 00:42:09,450 --> 00:42:12,100 如果我们只关心 这幅画的底部,现在, 949 00:42:12,100 --> 00:42:15,070 是,当我运行一个程序 而主要被调用, 950 00:42:15,070 --> 00:42:18,330 主要被给予一个组块 内存在我的电脑是 951 00:42:18,330 --> 00:42:20,060 在此所谓的堆叠的底部。 952 00:42:20,060 --> 00:42:22,143 而且我要画它 特意为正方形。 953 00:42:22,143 --> 00:42:24,540 因此,这就像32位或4个字节。 954 00:42:24,540 --> 00:42:28,790 如果这主要功能有一个 变量名为x为1的值 955 00:42:28,790 --> 00:42:32,626 并且它有一个称为可变 y随的2的值,这是 956 00:42:32,626 --> 00:42:35,750 喜欢采取这种条子的内存 主已经通过操作定 957 00:42:35,750 --> 00:42:38,850 系统并瓜分,使 第一本地变量超出这里, 958 00:42:38,850 --> 00:42:40,930 第二个放在这里,这就是它。 959 00:42:40,930 --> 00:42:45,590 >> 当主呼叫交换,交换 都有自己的内存片 960 00:42:45,590 --> 00:42:48,280 我们将得出这样的 从操作系统, 961 00:42:48,280 --> 00:42:50,820 而这将有其 根据自己的局部变量 962 00:42:50,820 --> 00:42:53,825 我们实施早期 与局部变量 963 00:42:53,825 --> 00:42:58,010 和b,最初 得到的值1和2。 964 00:42:58,010 --> 00:43:00,450 不过,只要 在交换代码执行, 965 00:43:00,450 --> 00:43:03,760 和劳伦实际交换的 辛普森和牛奶,发生了什么? 966 00:43:03,760 --> 00:43:09,030 那么,这2成为1,本 1正在成为2,和,顺便说一下, 967 00:43:09,030 --> 00:43:13,360 有一个临时变量,正在被 使用的整个过程中,最终 968 00:43:13,360 --> 00:43:14,470 消失了。 969 00:43:14,470 --> 00:43:16,720 但它并不重要 多少工作你做 970 00:43:16,720 --> 00:43:22,160 在这条线在此内存空间of--, x和y是完全不变。 971 00:43:22,160 --> 00:43:26,320 >> 因此,我们需要给予一些方法 交换和功能,例如它 972 00:43:26,320 --> 00:43:32,640 秘密访问,如果你愿意,给 功能li​​ke--到存储器像x和y。 973 00:43:32,640 --> 00:43:35,110 因此,让我们一起来看看 一个例子,可为 974 00:43:35,110 --> 00:43:38,220 我们来看看到底是什么一直 怎么回事这整个时间。 975 00:43:38,220 --> 00:43:40,284 我要继续前进 开拓比较为零。 976 00:43:40,284 --> 00:43:42,200 而且我要关闭 我们的调试器,我要去 977 00:43:42,200 --> 00:43:44,360 关闭这个面目可憎消息 刚说,等一下, 978 00:43:44,360 --> 00:43:45,800 你在中间的调试。 979 00:43:45,800 --> 00:43:48,383 我要在这里隐藏此选项卡 刚回到简单。 980 00:43:48,383 --> 00:43:50,160 如果GDB被杀害所以不要担心。 981 00:43:50,160 --> 00:43:53,910 这只是意味着,该方案具有 已经辞职,故意在这种情况下, 982 00:43:53,910 --> 00:43:54,820 由我。 983 00:43:54,820 --> 00:43:57,700 >> 而现在比较零做到这一点。 984 00:43:57,700 --> 00:44:00,110 我使用的是CS50 库中的标准I / O。 985 00:44:00,110 --> 00:44:04,319 我有一个主要功能第一 说,说些什么,并得到一个字符串。 986 00:44:04,319 --> 00:44:06,110 然后再和说 得到另一个字符串。 987 00:44:06,110 --> 00:44:09,910 并注意这两个字符串 被称为s和t分别。 988 00:44:09,910 --> 00:44:12,910 而现在这个方案,比较 零,它在生命的目的, 989 00:44:12,910 --> 00:44:15,470 它应该告诉我, 我才键入同样的事情? 990 00:44:15,470 --> 00:44:16,910 所以我要回一个星期。 991 00:44:16,910 --> 00:44:19,950 我用我等于等于运算符 这是质量运算符。 992 00:44:19,950 --> 00:44:22,220 不是赋值运算符, 等号运算符。 993 00:44:22,220 --> 00:44:23,890 我只是比较s和t。 994 00:44:23,890 --> 00:44:27,470 >> 因此,让我们真正去前进,做到这一点。 995 00:44:27,470 --> 00:44:32,680 而且我要继续前进 并进行比较为零。 996 00:44:32,680 --> 00:44:35,110 我该怎么办./comparezero。 997 00:44:35,110 --> 00:44:37,150 我要去 前进,说些什么 998 00:44:37,150 --> 00:44:43,450 喜欢,让我们做妈妈的小写 怎么样的妈妈大写。 999 00:44:43,450 --> 00:44:45,034 当然我型不同的东西。 1000 00:44:45,034 --> 00:44:45,533 好吧。 1001 00:44:45,533 --> 00:44:46,570 这是可以预料的。 1002 00:44:46,570 --> 00:44:47,640 >> 让我们再次运行它。 1003 00:44:47,640 --> 00:44:49,740 这两次做小写字母,小写字母。 1004 00:44:49,740 --> 00:44:51,490 这看起来超一样对我。 1005 00:44:51,490 --> 00:44:52,930 输入。 1006 00:44:52,930 --> 00:44:53,430 行。 1007 00:44:53,430 --> 00:44:55,804 也许这只是奇怪,因为 它不喜欢我的语法。 1008 00:44:55,804 --> 00:44:59,930 因此,让我们做一个大写妈妈, 资本妈妈,是相同的。 1009 00:44:59,930 --> 00:45:01,490 不同的东西。 1010 00:45:01,490 --> 00:45:03,907 >> 那么,为什么会这样? 1011 00:45:03,907 --> 00:45:06,240 那么,什么是实际去 在这里引擎盖下? 1012 00:45:06,240 --> 00:45:08,180 因此,让我们回去了 这里只是一个时刻 1013 00:45:08,180 --> 00:45:10,910 并且考虑什么的GetString 其实这样做。 1014 00:45:10,910 --> 00:45:13,385 当你打电话的GetString, 这是一个函数,我们 1015 00:45:13,385 --> 00:45:16,510 自己写的,它以某种方式得到了 序列来自用户的字符。 1016 00:45:16,510 --> 00:45:20,280 而且,我们认为第一 一次我打电话的GetString,这给了我 1017 00:45:20,280 --> 00:45:21,930 一个内存块,看起来像这样。 1018 00:45:21,930 --> 00:45:26,990 如果我输入全部小写 M-O-M--和之后发生的事情? 1019 00:45:26,990 --> 00:45:28,840 只是一个快速的完整性检查。 1020 00:45:28,840 --> 00:45:29,780 >> 反斜杠零。 1021 00:45:29,780 --> 00:45:30,510 我们知道。 1022 00:45:30,510 --> 00:45:32,784 而记得我们打了 与Zamila名左右 1023 00:45:32,784 --> 00:45:34,950 和一堆其他的名字 当罗布在这里寻找 1024 00:45:34,950 --> 00:45:36,280 在什么内存里面发生。 1025 00:45:36,280 --> 00:45:37,780 所以,这个故事是完全一样的。 1026 00:45:37,780 --> 00:45:40,160 这是什么的GetString 将返回给我。 1027 00:45:40,160 --> 00:45:44,780 现在,我的代码刚才存储 GetString的返回值 1028 00:45:44,780 --> 00:45:47,510 在一个变量被称为第 1029 00:45:47,510 --> 00:45:51,390 然后我第二次把它称为, 它存储在一个变量称为T。 1030 00:45:51,390 --> 00:45:55,070 >> 所以,如果我在这里走了过来,我需要 作出这样的本地变量 - 1031 00:45:55,070 --> 00:45:59,610 而我一般会 画一个字符串作为just--我们 1032 00:45:59,610 --> 00:46:02,360 称之为S--这里作为一个小广场。 1033 00:46:02,360 --> 00:46:09,760 而现在,somehow--怎么做妈妈 去这个变量s里面? 1034 00:46:09,760 --> 00:46:12,010 好了,我们要回去 这里首要原则。 1035 00:46:12,010 --> 00:46:15,660 什么是的GetString实际上返回? 1036 00:46:15,660 --> 00:46:19,030 >> 所以,事实证明,M-O-M 反斜杠零,和任何数目的 1037 00:46:19,030 --> 00:46:22,364 在内存像其他字符串 Zamila和Rob或安迪或任何其他人, 1038 00:46:22,364 --> 00:46:24,280 当然在我们的 计算机的RAM或存储器。 1039 00:46:24,280 --> 00:46:27,760 而你的内存有like--你有 RAM的演出,内存2演出, 1040 00:46:27,760 --> 00:46:30,860 或十亿或两个十亿字节, 或者甚至更多,这些天。 1041 00:46:30,860 --> 00:46:34,070 因此,让我们假设,对于今天的目的, 这不要紧,我们如何编号 1042 00:46:34,070 --> 00:46:36,640 他们,但我们可以号每 这十亿两十亿的 1043 00:46:36,640 --> 00:46:37,880 三四十亿字节。 1044 00:46:37,880 --> 00:46:42,240 >> 而我们只是武断地说, 这是第一个咬,咬第二口, 1045 00:46:42,240 --> 00:46:43,380 第三,第四。 1046 00:46:43,380 --> 00:46:46,570 我故意不使用零 今天,但我们会回来的。 1047 00:46:46,570 --> 00:46:49,570 因此,换句话说,如果是这样的 第一次我正在使用的程序, 1048 00:46:49,570 --> 00:46:52,715 我刚开始运气和第一 咬是位置的一个那么双 1049 00:46:52,715 --> 00:46:53,590 那三四十。 1050 00:46:53,590 --> 00:46:57,430 如果我不停地画,箱号 的两个十亿会的方式在这里。 1051 00:46:57,430 --> 00:47:02,200 >> 所以,你怎么想的话, 的GetString实际上返回? 1052 00:47:02,200 --> 00:47:06,010 它没有返回M-O-M反斜杠 零本身,因为这明显 1053 00:47:06,010 --> 00:47:08,180 我已经开箱子不会格格不入。 1054 00:47:08,180 --> 00:47:11,210 那么还有什么可以真正的GetString 将返回所有这几个星期? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 答案是上 董事会这里的某个地方。 1057 00:47:16,820 --> 00:47:20,390 你可以不适合M-O-M反斜杠零, 那么,什么可能是有意义的呢? 1058 00:47:20,390 --> 00:47:23,424 如果你必须是超级聪明,把 上的所谓的工程帽, 1059 00:47:23,424 --> 00:47:24,340 什么你能回来吗? 1060 00:47:24,340 --> 00:47:27,340 什么是最少量的信息 你仍然可以返回会 1061 00:47:27,340 --> 00:47:30,610 让你找到M-O-M的内存? 1062 00:47:30,610 --> 00:47:31,270 是吗? 1063 00:47:31,270 --> 00:47:31,950 >> 听众:一。 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J.马兰:一。 1065 00:47:32,200 --> 00:47:33,021 为什么呢? 1066 00:47:33,021 --> 00:47:35,520 听众:因为它会告诉 你去哪里[听不清]。 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J.马兰:没错。 1069 00:47:39,390 --> 00:47:44,300 我只是要返回地址 我所得到的字符串。 1070 00:47:44,300 --> 00:47:46,570 在这个地址 此案的位置之一。 1071 00:47:46,570 --> 00:47:51,280 所以,真正被存储在S-- 和每一个字符串变量从而far-- 1072 00:47:51,280 --> 00:47:53,430 刚刚被 该字符串的地址。 1073 00:47:53,430 --> 00:47:57,840 >> 同时,如果我叫 GetString的第二次,我 1074 00:47:57,840 --> 00:48:03,300 请在字面上相同件事 - M-O-M与lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 而另一个反斜杠零, 现在也许我的程序 1076 00:48:06,200 --> 00:48:09,820 已经运行了一段时间,所以也许这 是10,这是位置11,这是12, 1077 00:48:09,820 --> 00:48:10,700 这是13。 1078 00:48:10,700 --> 00:48:13,590 使用一些其他的计算机 内存无论出于何种原因。 1079 00:48:13,590 --> 00:48:18,172 怎么现在去我的第二个 在我的节目T变量? 1080 00:48:18,172 --> 00:48:19,390 10。 1081 00:48:19,390 --> 00:48:20,050 没错。 1082 00:48:20,050 --> 00:48:23,910 >> 所以,当我们在看 这个程序源代码 1083 00:48:23,910 --> 00:48:26,550 在这里我只是想 比较这两个值, 1084 00:48:26,550 --> 00:48:32,180 是S等于等于T,什么是 明显的人的答案是什么? 1085 00:48:32,180 --> 00:48:34,890 只是没有因为1不等于10。 1086 00:48:34,890 --> 00:48:36,861 所以,这里存在一个 对我们的机会真的 1087 00:48:36,861 --> 00:48:39,610 刚回去,再一次,第一次 原则想想,算了, 1088 00:48:39,610 --> 00:48:41,110 这是怎么回事引擎盖下? 1089 00:48:41,110 --> 00:48:43,240 我们一直在谈论 位和字节和存储器, 1090 00:48:43,240 --> 00:48:46,820 但实际上它是有用的了解 因为当你打电话的GetString, 1091 00:48:46,820 --> 00:48:50,280 即使我们认为它是 返回M-O-M或字符串的妈妈 1092 00:48:50,280 --> 00:48:53,120 或者安迪或Zamila或 等,在技术上 1093 00:48:53,120 --> 00:48:55,510 它只是返回的地址 的内存块。 1094 00:48:55,510 --> 00:48:56,910 >> 但是,这是确定的。 1095 00:48:56,910 --> 00:49:00,570 因为我怎么知道 其中字符串结束? 1096 00:49:00,570 --> 00:49:03,840 如果我只给的开始? 1097 00:49:03,840 --> 00:49:05,380 那么,反斜线零,对不对? 1098 00:49:05,380 --> 00:49:08,800 就在线性时间我可以 与印刷清晰度M-O-M打印出来。 1099 00:49:08,800 --> 00:49:11,820 而当我看到反斜线 零,我不在乎,我开始, 1100 00:49:11,820 --> 00:49:14,950 我已经知道含蓄 在这里我需要结束。 1101 00:49:14,950 --> 00:49:18,700 >> 所以,今天标志着beginning--和 让我做这将大大因为我们 1102 00:49:18,700 --> 00:49:21,800 经历了很多的麻烦, 这些在这里训练wheels--得到 1103 00:49:21,800 --> 00:49:29,840 所以今天的训练轮开始 脱落,我们揭示了在least-- 1104 00:49:29,840 --> 00:49:31,373 >> [掌声] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> 这是值得一游 瞄准这一早上,是吗? 1107 00:49:36,160 --> 00:49:39,600 所以now--有,原来 出,没有这样的事情串。 1108 00:49:39,600 --> 00:49:41,140 字符串不存在。 1109 00:49:41,140 --> 00:49:43,760 这是我们已经有代名词 里面的CS50库。 1110 00:49:43,760 --> 00:49:48,660 今后,我们将开始打电话 s和t不是字符串,但字符明星。 1111 00:49:48,660 --> 00:49:51,180 与焦炭星,我们将 梳理出前长。 1112 00:49:51,180 --> 00:49:53,510 但是这并不是说, 即使我们继续 1113 00:49:53,510 --> 00:49:56,180 使用的GetString现在, 技术上我应该 1114 00:49:56,180 --> 00:49:59,010 可以说,炭星和焦炭的明星。 1115 00:49:59,010 --> 00:50:01,720 >> 而事实证明那是什么星 是要表示的东西 1116 00:50:01,720 --> 00:50:04,340 所谓的指针或地址。 1117 00:50:04,340 --> 00:50:06,110 而事实上,一个传情 面对未来 1118 00:50:06,110 --> 00:50:09,760 是这20秒的剪辑我们 朋友尼克Parlante在斯坦福 1119 00:50:09,760 --> 00:50:12,927 谁,前一段时间,花 一段荒谬的数额, 1120 00:50:12,927 --> 00:50:15,010 作为最好的,我可以告诉他 厨房或他的地下室, 1121 00:50:15,010 --> 00:50:17,140 制作粘土动画 引进世界 1122 00:50:17,140 --> 00:50:20,010 指定的字符 宾基与我们将 1123 00:50:20,010 --> 00:50:22,010 下一次被介绍给指针。 1124 00:50:22,010 --> 00:50:24,588 因此,这里是一个什么样的来预览。 1125 00:50:24,588 --> 00:50:26,370 >> [视频回放] 1126 00:50:26,370 --> 00:50:27,510 >> - 嘿,宾基。 1127 00:50:27,510 --> 00:50:28,260 醒来。 1128 00:50:28,260 --> 00:50:30,672 现在是时候为指针乐趣。 1129 00:50:30,672 --> 00:50:31,616 >> -那是什么? 1130 00:50:31,616 --> 00:50:33,032 了解指针? 1131 00:50:33,032 --> 00:50:34,450 哦,好极了。 1132 00:50:34,450 --> 00:50:35,431 >> [结束播放] 1133 00:50:35,431 --> 00:50:38,055 DAVID J.马兰:而关于这一点, 我们会看到你在周三。 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 好吧。 1136 00:50:48,090 --> 00:50:48,740 谁是跳舞? 1137 00:50:48,740 --> 00:50:49,240 来吧。 1138 00:50:49,240 --> 00:50:50,330 谁是跳舞? 1139 00:50:50,330 --> 00:50:51,820 你想让我得到它开始了吗? 1140 00:50:51,820 --> 00:50:53,770 我会得到它开始。 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> LAUREN:甜花哨的摩西。