罗伯:好吧。 欢迎到首节。 我抢。 约瑟夫:我是约瑟夫。 罗伯:所以我们将深入权利英寸 首先要说说 是电器。 所以希望你们中的大多数都 已经下载了它。 但是你可以看到指示 在cs50.net/appliance。 哦,上帝,现在我的自我意识。 我还听到它。 约瑟夫:哇,这听起来像 它的晕头转向。 罗伯:所以有些人一直有 与它的问题,所以不要等到 问题的最后一分钟设置为 试图解决的电器和 找出它不工作。 约瑟夫:如果有什么不工作 而你需要帮助,你可以去 cs50.net/discussion我们 有一个论坛,在这里你 可以发布您的问题。 我们会得到他们最终。 罗伯:好吧。 因此,这是什么样的电器 模样。 再次,它只是一个完全独立的 操作系统内运行的 无论操作系统你 在笔记本电脑上运行。 和主就是你 使用是gedit的。 所以希望这已经 成为一个熟悉的网站。 该终端。 你也可以运行Chrome浏览器 内的电器。 曾有一对夫妇的人 谁曾报道互联网 在设备无法正常工作。 其中一些刚刚假设 有是不应该 网络中的设备。 但是,是的,还有被认为 是互联网。 我会说出来的权利,但它不 真正意味着什么。 如果网络不能正常工作, 这就是你往往需要 运行修复它。 如果您有互联网的问题,不 记住它,只是它张贴在 讨论,我们会说,运行。 但互联网应该是工作。 所以,唯一的其他东西 - 是啊,没有什么 别的是真正相关。 但我只是想指出 - 请参阅本右下角。 所以,你的每一个设备的应 有一个IP地址。 后来在这个学期,该IP 地址将变得更加重要时 你的工作在网络上对集,因为 你就可以访问 网站,你正在努力从你的 当地的Chrome使用此IP地址。 但我喜欢用的IP地址 为 - 和你没有做到这一点,我 只是想指出来 - 就在这里。 所以这是一个终端窗口 我的Mac,这不是在 电器都没有。 并且你可以看看是什么 这个命令的作用。 但我直接去的SSH 我的电器。 我不知道IP是什么。 约瑟夫:168 - 168.224.1.0。 罗伯:所以一旦我受够了 与此,请登录。 现在,基本上,这是相同的 我的电器内的终端窗口。 所以,我几乎从来没有真正的工作 从设备本身。 我只是一直有它运行 在最小化的背景 并SSHed进去。 这个问题是你不打算 能够容易地用gedit 直接从本。 但是,如果你想成为一个真正的酷 黑客,那么你应该习惯了一个 命令行的文本编辑器呢。 所以Vim和Emacs和纳米,所有这些 有不同的选择。 纳米往往是最容易的。 而且我认为它没有 语法高亮。 哦,不,完全不会。 所以你可以使用纳米,因为 那一个是很容易的。 你看到所有这些命令 在底部。 这个小胡萝卜象征。 如果你以前没有见过它,你会 可能看到了很多了。 这通常意味着控制胡萝卜, 喜欢你的键盘的左下角 控制字符。 所以在这里它告诉我到这里 - 哦,这不是断我是否放大。 所以,控制,X是如何 我要退出。 和它说我打的Y 是的,对于节能,N代表号 所以这是纳米。 Vim和Emacs往往是稍 复杂的和压倒一切的。 但是你可以习惯它, 然后你会爱上它。 所以,就是这样。 约瑟夫:没必要那样做。 罗伯:是啊。 你可以自由地用gedit的 其余的学期。 所以任何设备相关的问题? 还是你有什么别的什么想法 必须谈及有关 家电? 是。 扬声器1:当你SSHed到您的 的事情,是密码深红? 罗伯:是啊。 对于几乎所有的密码 在电器是怎么回事 是深红。 扬声器2:安装像一个真正的IDE 在设备上,将它的工作? 罗伯:我想象的Eclipse确实有 Fedora的版本,在这种情况下,是的, 你可以做到这一点。 它可能不是真的值得。 扬声器2:确定。 所以它可能如果我想更轻松 使用Eclipse,只需使用原生和 然后上传到 - 罗伯:哦,那也是可能更容易。 但你可以得到它的工作 内的电器。 约瑟夫:而对于摄像头的问题 是,你可以安装另一个 IDE中的电器内? 罗伯:Eclipse中作为一个 例如一个IDE的。 任何其它电器问题吗? 好的。 所以我们现在进入到命令行 接口相关的东西,所以CLI。 又一次,我只是去上班的 在这里,因为这是相同的 在一个终端窗口工作 内的电器。 是如何形成的字体看? 是否足够大? 好的。 所以有很多的命令是 你应该得到很习惯 整个学期。 大二用于导航的LS,列表 此目录中的文件;和 CD,所以更改目录。 这样我就可以改变桌面,然后 一个很常见的模式是cd到一个 目录并立即LS 什么的在目录中。 人们有时也没有意识到 该选项卡完成的一件事。 因此,像CD,VH,然后我打标签。 我几乎从来不打出来 整个事情。 然后,如果我继续打标签 再次,它会自动 开始我列出。 所以我可以cd虚拟主机,本地主机。 而这只是要 - 如果你还没有听说过这个词 之前,目录是另一个字 为文件夹。 所以,现在如果你看 - 让我们把那个顶端。 所以,现在,如果你在括号中看到的,你 看到小波浪线,斜线,虚拟主机, 斜线,本地主机。 所以,波浪,是指 我的主目录。 这是你的目录 当你通过SSH连接。在 这是你在​​当目录 你打开一个终端。 这是你从哪里开始。 所以我为我的主目录里面, 而我的虚拟主机里面 我的主目录的目录中。 然后我在本地内 主办这里面的目录。 因此,一些其他的与CD有用的事情 - 或好,一般,所以总是点 指的是当前目录。 镉,点是一个非常值钱的命令。 但是,这改变的 当前目录。 一个更有效的方法之一在以下方面 CD是点,点,这是 只是去了一个目录。 并注意,这些 - 我想说的别名,但这些 符号,点和点,点,这些工作 对于几乎你的任何命令 将运行在想。 因此,像CD可能是在那里你会 使用最多的,但这些都不是 事情刚刚CD理解。 这是相当多的东西你的整个 命令行了解。 很多程序可以理解 点与点,点。 所以其他有用的 - CD,破折号。 所以这是要带我去了 我是去年英寸目录 所以有时候我会做这样的事情, 哦,我的工作在这里。 而我看​​到的东西一定误差, 我会去通过去调查它 一些随机的目录里。 我不知道这是否会 让我在那里。 它的意志。 于是我做我想做的事情 在此目录中。 胡说,胡说,胡说,胡说,胡说。 我当时想,没事,我想 回到我在哪里。 CD,破折号,它带给我的右后卫。 所以,我要扔了很多 今天的这些你。 我不希望你记住 所有的人。 样的,它只是知道 它们的存在。 再后来就当你喜欢, 嗯,我想回去 目录我只是在,哦,等等, 类似的东西存在。 你不必只需键入 再整个目录。 约瑟夫:最终你会刚 一遍又一遍的使用它们,并且 它会变成肌肉记忆。 罗伯:是啊。 我以前那么如何说,那波浪 是你的home目录。 所以我可以cd,波浪线。 但我什至不有 这样做,如果我只是 - 我会回去的目录,以便 这不是一个毫无意义的例子。 但是,如果我只是做CD,这也是该 一样,去我的主目录。 我做的命令,K. 约瑟夫:您也可以键入清晰, 总之,它应该清除它。 罗伯:我也想控制, L同时,这样做了。 所以,很多不同的方式。 我觉得有一定的差异,其中 明确和控制,L将只 真的把它推到顶部, 我仍然可以向后滚动。 命令,K字面上破坏 一切,你 不能滚动备份。 最起码,这是 它是如何工作的iTerm2。 我不知道其他的事情 - 哦。 用ssh方式连接,所以如果你是在Windows上, 你将要下载的PuTTY 为了SSH,因为Windows不 有这样一个内置的SSH工具。 从Mac电脑,你可以只是直接的SSH 从终端窗口。 确定。 有问题吗? 通过ls,所以一些习惯 大多数这些命令是 - 好了,我就做一个。 LS,破折号,L。 所以破折号,l是什么,我们要去 调用一个标志,LS。 和很多这些命令有标志 您可以传递给他们。 所以在这种情况下,仪表板,l是一个标志 告诉它给我一个完整的 所有的信息清单 这些文件。 所以,我们在这里看到,桌面是 在12:54更新于7月30日。 下载于9月6日修改。 这些都是当前大小和 这些目录中的字节数。 您不必了解 所有这一切。 这东西在左边,这些drwx的, 这将成为更相关 以后当你不得不处理 - 有做谁拥有权限 来看看这些文件。 所以,如果你没有上唯一的用户 这台电脑,你就可以到 说好,我应该是唯一一个 可以看看这个文件,或者我 要允许每个人 看看这个文件。 所以,别人在我的电脑上 可以看看这个文件。 我什至不知道这是什么 - 这是什么呢? 约瑟夫:我不太清楚,其实。 罗伯:不知道。 约瑟夫:但是,如果你不知道,有 您可以使用一个有用的命令 告诉你什么装置的输出。 如果你的男人类型 该命令前 - 所以M-A-N。罗伯:男人。 这样的人是另外一个 这是非常有用的。 和男人,LS。 因此,手册页,他们有两个 命令,你将要使用 在命令行中,他们也有 功能,将有关 与C所以,你可以man - 我忽略3。 但3人的printf会带来 了C版的printf。 但是,如果我只是做男人的printf,这是 要调出命令的printf 这种情况发生在命令行。 这样的男人,LS。 手册页可以很 铺天盖地。 在这里,虽然,你会看到此房源 所有这些标志的是LS 理解。 因此,如果我们去冲,l和 - 我只是要在你扔了。 但为了搜索,你要 先打问题 标记或斜线按钮。 所以,凶多吉少。 然后我就可以搜索 对于我想做的事情。 所以我打算削减为破折号,L。 而且它那里。 因此,使用一个长列表格式。 这并不能帮助我弄清楚什么 该特定列的意思,但我 假设在这里的某个地方 它会解释。 因此,使用手册页的任何命令 你不立刻明白了。 我敢肯定,你甚至可以男人,男人。 在线给接口 参考手册。 呵呵,最后一个是也许稍微 相关的是LS,破折号,。 所以请注意,如果我只是做LS, 我得到这五个文件。 如果我做LS,破折号,我 得到更多的文件。 所以,所有这些之间的共同点 新文件是事先点。 因此,该公约是一个文件, 以圆点开头的隐藏。 所以,你不希望看到这个文件,你 不想拥有它惹 您的目录清单。 只有当你明确要求, 没事,LS,破折号,,告诉我。 的一个代表所有文件, 包括隐藏的。 因此,一些其他命令。 哦,在这一点上的问题? 是。 扬声器3:当你做LS, 一,什么是点,点? 罗伯:哦。 所以,这就是我在说什么。 这是同样的事情在那里 我喜欢的CD,点,点。 所以在技术上,点和点,点是 存在于每一个文件 所在的目录dot文件指 到当前目录。 所以,如果我的CD,点,我只是去 留在目录中。 和圆点,圆点总是指 以前的一级目录。 所以,如果我进入日志和ls,破折号,人, 我会看到圆点,圆点。 cd到网点,网点 使我先前的目录。 是啊。 确定。 因此,另一个非常重要的 命令为rm。 所以,这就是我们要去 使用去除。 让我实际上做一套 命令第一。 所以MKDIR。 MKDIR是你可以 创建目录。 我会创建一个临时目录 并进入该临时目录。 和预期的一样,它是空的。 但是,如果我LS,破折号,一个,我还有点 与点,点,因为点是指 当前目录。 与点,点指 上一个目录。 而那些将永远存在,无论 您所在的目录 这是一个完全没有必要的 命令,但触摸。 我只是用它,因为它是 一个简单的方法来创建文件。 所以触摸,触摸B,触摸c是刚 要创建一个名为三个文件, b和c是完全空的。 于是我点创建那些在 首先就是这么说是RM 我们如何才能将其删除。 所以,RM,一。 它会问我,取出 常规的空文件? 然后我会说是的。 所以,如果我确实知道我要 删除该文件,而不必是 提示,定期删除空文件?, 然后RM,破折号,F将是该 标志,上面写着,强制删除而不 甚至促使我哦,是你 确定要删除的文件? 是的,我敢肯定。 所以,RM,破折号,FB将只 做到这一点不求回报。 因此,让我们做一些更多的目录。 MKDIR,TMP2,CD,TMP2, 触,触按B。 确定。 所以现在我想删除 TMP2作为目录。 所以,RM TMP2。 你不能删除TMP2, 它是一个目录。 因此,这里的问题是,RM不 马上工作在目录上。 它只是意味着像文件 非目录的文件。 所以我们能做些什么 这里为rm,破折号,河 这表示递归,这可能 不是对你意味着什么呢。 但是,当你到了递归, 这将意味着更多。 所以,RM,破折号,R,TMP2是要 递归进入该目录。 于是陷入目录TMP2? 是的,让我们考虑这样做。 难道我们要删除TMP2 /一? 是。 难道我们要删除TMP2 / B? 是。 现在,我们要删除 目录TMP2? 是。 所以现在的目录 和里面的一切 它已被删除。 有技术上的命令RMDIR 您可以用它来去除 目录,但它仅适用 在空目录反正。 并且一看就知道,我们只 再做MKDIR,TMP2。 TMP2,触摸。 确定。 所以,如果我尝试删除dirtmp2,它​​会 说,目录不是空的。 所以,我几乎从来没有使用remove dir命令无论如何,因为RM,破折号, r会为其工作的空目录 和非空目录。 还有,如果我不希望有 经历了整个过程 降入目录,并 删除每个单独的文件,RM, 破折号,RF,TMP2。 而现在它不见了。 东西要小心 关于为rm,破折号,RF。 它让我害怕,甚至键入它, 因为如果我不小心 按Enter键或东西。 所以,RM,破折号,RF,波浪会,不 提示我,F不提示 我,它会自动删除 我的整个主目录和 一切都在它。 所以,你可能认为这是 一个愚蠢的事情。 很好,它是。 但它可以通过很容易出现 意外,如果说,我想删除 我的斜线,虚拟主机目录。 而就在快速打字, 我不小心这样做。 这将递归删除我的两个 主目录和虚拟主机目录 这个特定的目录中,仅仅 恰好不存在现在。 但是,这仍然会删除 我的整个主目录。 至少是没有一个f, 它会先提示我。 我会想,哦,不,我 不想做。 但是,人们,斜线,包括 我往往会得到进 习惯总是RF-ING。 即使是常规文件,我可以只RM, C,我倾向于只RM,破折号,RF,C。 只是要小心,当你RF-ING。 扬声器4:什么是c执行? 罗伯:C被我说的是C文件 在此目录中,即RM,C。 约瑟夫:而更危险的是,如果你使用 一个明星,它是指在一切 的目录。 所以我通常倾向于做是我会的 进入一个目录,我想 除去在那里的所有文件。 所以,RM,破折号,RF,明星。 罗伯:是啊。 室,破折号,RF,明星。 约瑟夫:如果你不小心 你在哪个目录 - 我是不是临时的,但我还是不小心 在我的主目录, 然后我会删除一切 在我的主目录。 而我实际上做到这一点之前,和 我觉得你还是以前做过这 周杰伦之前做到这一点。 罗伯:我不小心删除 - 所以忽略该命令为位。 乔瑟夫:不好玩。 罗伯:所以在斜线bin目录是一个 一串二进制文件,其中有会 熟悉的像铛。 好了,铛,基本上所有这些 我在命令正在运行的东西 线是在这个斜线bin目录下。 约瑟夫:像LS是在这里。 罗伯:那么点,斜线,LS会 列出该目录。 约瑟夫:室也是在这个目录中。 罗伯:我不小心RM,RF,海关斌, 其中删除任何命令我可以 可能是有史以来想要的。 然后我刚刚重新安装 新的电器在该点。 乔瑟夫:所以要非常小心,当 使用此命令。 观众:[听不清]? 罗伯:是的。 这也是一个不好的习惯进入。 如果你注意到,我现在 - 好了,你不能看到,但 我使用zoom-in,也许可以。 所以,我现在根@设备。 所以jharvard是我们想要的用户 你总是可以使用。 根是具有权限的用户 做任何事情绝。 所以请注意,当我jharvard, 如果我尝试到CD - 什么是目录? 哦,根是一个很好的例子。 所以CD,根。 权限被拒绝。 因为如果我们看一下此房源 - 又一次,你不必 完全理解这一点。 但是这三个破折号都这么说 没有让任何其他 用户进入这个目录。 并且该目录恰好 由root用户所拥有。 所以,我其实jharvard无 一个谁不是root允许进入 这个目录,这意味着我 会得到权限被拒绝时,我 试试cd到它。 所以,当我的根,我有权限 绝对做任何事情,包括 删除重要文件 在电器和 毁掉整个事情。 所以这是一个不好的习惯进入 只是四处游荡的 操作系统的根。 我反正做。 有问题吗? 我会退出的根,留为jharvard。 确定。 更多相关的命令。 所以,要回我们的温度时, mv命令代表的举动。 您可以移动。 现在,我们要叫它B, 所以现在它称为B。 或者,也许我们要移动 B上涨一个目录。 所以,现在这个目录是空的。 我将回到我的主目录, 我们看到,b为在这里,因为 主目录是从一个目录了 是B曾经所在的目录。 还有CP。 因此,CP是复制的超级节, 点,文字。 我可以调用它s,点,文字。 现在我们有两个超级节, 点,文字,和s,点,文字。 这也适用于目录。 我RF,海关单个文件。 因此,CP - 好了,首先让我们来试试CP,TMP,TMP2。 所以省略tmp目录。 如此相似RM,默认行为 是对目录不起作用。 再次,类似RM,默认 行为 - 好,得到它的工作 使用目录是一个,破折号-R的路程。 所以递归复制该温度 目录复制到TMP2。 所以现在我们有两个tmp目录和tmp2 那是不是有益的,因为TMP 是空摆在首位。 TMP2。 现在,让我们tmp目录复制到TMP2。 而且我们看到,TMP2还具有文件 一,因为目录和 一切的那里面 目录被复制。 而这可能有点帮助 如果说你的工作 在问题设置1 - 或者实际上,后来问题集 更为重要的,因为有 将一大堆 文件和事情。 但你只是想,对于一个分裂 第二,你喜欢,没事,我 要尝试不同的东西。 让我复制我的整个PSET1 目录复制到PSET1备份,这样如果 我最终搞砸的事情了,我可以 返回到我的备份目录。 还有更合适的方法 版本备份你的代码,但 这始终是一个快速的方法来只是让 确保你有东西副本 那你要修改。 所以回声也是一次性的命令 一种sillily将只打印到 命令行到底是什么 你想呼应。 所以回声喜。 我们将只打印喜。 回声的hello world。 我们将打印的hello world。 这涉及到使用的时候你 启动合并命令。 再次,不要指望你完全 理解这一步,但它的 看到的东西。 然后,如果你对谷歌搜索的例子 或者你知道你想要做的 的东西,它可以是有益的。 因此,让我们作为一个例子, 所以LS,破折号,L。 所以我在这里看到的输出 LS的,破折号,L。 我说好,我想 存储到文件中。 所有在这里的输出,我想 投入到一个单独的文件。 比符号更大所以这一点 就是我们要去打电话。 我们的重定向 输出到文件中。 让我们把文件等等,因为这是 我往往会在调用它。 所以现在我们看到我们有一个 文件胡说就在这里。 如果我打开它,我会看到它的 正是从这个命令的输出 我只是跑。 同样,你可以 - 如果这是输出到一个文件中,这 从文件中获得输入。 什么是命令,我 - 约瑟夫:我想你可以用 少跌多,大概。 罗伯:但如何只少废话? 我不知道。 如果你进入这个场景,像 有pset时,它是很有用的。 约瑟夫:你可以管成回声。 管道文件到回波看到它。 罗伯:这是管道。 约瑟夫:对不起。 罗伯:好吧。 因此,这是输出到文件。 这是从文件中获取文本 并把它交给该程序。 而且你还可以看到这个家伙。 因此,这是一次那种做两个。 而实际上,我将介绍两个新 命令只是为了它的使用。 历史是一个方便的命令,这只是 将打印出的清单 任何我曾经运行的命令行。 所以,我们在这里看到的一切,我有 已经运行这整个时间。 大量的LS的。 而另一个有用的命令是grep的那 其目的是为了在搜索 文字寻找模式,好了, 寻找任何你 希望它去寻找。 所以这里一个方便的用途是,比方说 我们要抓住历史。 我要寻找的命令 在那里我 - 什么是 有用的宝贝? 约瑟夫:[听不清]? 罗伯:还是让我们只是看所有 倒是,不管是什么原因。 所以这是它的样子。 而你也不必完全 理解这一点。 但这个想法是在这里,历史是给 相同的输出它确实在这里 在那里它打印出整个 一切我曾经运行的历史。 然后我们又路过那个 - 而不是将它打印到屏幕,这样, 我们要传递给 命令grep的是寻找 字触摸的所有实例。 所以使用的这个组合 历史的工具和grep,我可以看到,OK, 这里的所有的命令,我曾经 运行,这里是一个有点常见的一种。 我们是在底部。 并且它也给了我命令 我刚跑了有 在它的词联系。 但管道是一个非常有用的东西 用于组合多个程序。 而实际上,这是为让快捷方式 我历史输出到文件等等,并 让我用grep使用文件等等 因为我想看看了。 所以管只是一个快捷方式 对于这两个命令。 是。 扬声器4:[听不清]? 罗伯:是的。 什么是 - 呵呵。 让我们来测试一下。 所以,猫,狗,鱼。 所以我想给grep。 短跑河,再次,将是 递归的,所以我想降下来 所有目录。 我想递归的grep对所有 - 让我暂时得到 这一点的方式。 不理我。 确定。 所以我想暂时用grep的 这个词的鱼的所有实例。 所以在这里我在做什么是用grep搜索 递归的字鱼。 和星意味着在所有的这些 此目录中的文件。 因此,这给了我拒绝的权限, 因为这是不允许读 特定的文件。 但它在文件中,测试中发现的鱼。 我也可以说,具体而言,我只 想看看在文件等等,在 这种情况下它不会找到任何东西。 我只是想看看在文件,测试。 它会找到鱼。 这是一个非常有用的命令 要知道一般。 有一些替代品到grep 这被认为是更加 程序员友好的,但我倾向于 仍然依傍的grep。 有问题吗? 确定。 还有没有其他的命令? 呵呵。 只是一次性的一个,我始终 发现很有趣的卡尔。 所以,当我在这个可爱的通知 全屏模式下,我没有最喜欢 工具栏或任何东西。 所以,卡尔只是给了我一个可爱的小 日历这是正确的 现在断了,我假设。 但可爱的小命令。 约瑟夫:这是[听不清]。 你可能有其他的命令 看到包括铿锵而作。 我们就去了他们 后面更详细。 但是,如果你已经工作 在PSET,你应该 熟悉这些。 罗伯:好吧。 在命令行的东西有问题? 好的。 因此,让我们进入到一些 C-相关的东西。 变量的数学。 确定。 所以就像我们有数学的划痕, 您还可以使用数学三中 在我们到达那个完全, 这样的变量。 请记住,当你声明一个 如int X或浮动y,则变量 必须给它之前键入 变量名。 因此,我们已经看到了类型到目前为止是int, 浮点型,双,很长很长,我 实际上不知道我们是否已经 看到这么远。 还有一些其他的。 我们已经看到字符。 有短,这是喜欢它的 相反的很长很长的地方是 比小的整数。 我们也看到字符串。 那么,什么是特别的字符串? 为什么我会说这是 不是很喜欢整型? 扬声器4:它并不真的存在。 罗伯:是啊。 因此,我们有字符串的唯一理由 是因为当你这样做 哈希,包括cs50.h. 我们会看到这样的例子以后 - 哦,那不处理好 - 其中cs50.h正在做的事情 沿型的线 闪避,焦炭星,字符串。 所以这是说,我们甚至不 知道一个char明星是什么呢。 但是,这是说我们要的字符串。 任何你已经使用字符串,你的地方 可以用字符明星已, 这实际上是一个类型, 存在于C语言。 但我们会到达那个。 哦,它会马上回来。 整齐。 所以,同样的事情与布尔 其中真假。 这是不是真的在C的内置型 相反,它只是,这是否有 零值? 然后,我们将只考虑 它是假的。 这是否有值 - 好了,这是否有任何 值不为零? 然后,我们将认为这是正确的。 所以,有一个为真,二是真实的, 任何非零为真。 因此,这些都是那些。 在声明变量的问题和 变量类型和所有? 是啊。 扬声器4:对于长很长,在书中, 它说,它必须是long long int的。 但也只是很长很长的工作? 罗伯:所以这些类型修饰符。 所以诠释x。 所以我们也可以说无符号诠释x。 我们可以说短诠释x。 我们可以说,很长很长诠释x。 但这些东西几乎任何我 刚才说了,无符号整型,短整型, long long int的,你可以摆脱 int和它只是假设 那你的意思是int类型。 所以无符号x,它只是意味着 - 你知道如何正常使用int, 你可以说x等于负3? 用一个无符号整数,你不能。 约瑟夫:再次,对于摄像头, 问题是,有什么区别 长的长整型之间 和公正的很长很长? 罗伯:是啊。 所以,我几乎从来不会 写的很长很长整型。 我会写很长很长。 约瑟夫:有问题吗? 罗伯:确定。 那真是太傻了一点提醒是如何 我们声明一个变量并初始化 变量和声明其他 变量和初始化 这一切在一个步骤。 变量如此的声明和 初始化变量没有 到,但可以在同一条线上。 因此,我们有标准的数学运算符 你已经习惯了 - 加,减,除,次。 还有模,我们拭目以待。 没有的话,至少在 C,一个内置电源 幂^操作符。 嗯,有一个插入符号运算符, 但它不是权力。 约瑟夫:但它不是幂, 是。 罗伯:不要使用插入符号 假定它是指 像方或什么的。 所以有些事情保持 介意师。 我会受不了。 如此宣布初始化的答案。 所以,我们说浮动答案 等于1除以10。 打印答案到小数点后两位。 这就是这种东西,我 将男人的printf弄清楚, 这到底是什么%,网点,2F是什么意思? 而这只是意味着,好吧, 无视0.2。 和%f是用什么 打印浮动。 0.2是说,复印件 浮到小数点后两位。 所以这个程序有一个bug,你可能会 已经在一些见过这个 前政务司司长课程。 但是,什么是错误? 扬声器5:零。 罗伯:是啊。 所以,当我们说,答案等于 1除以10,我们想要的 回答是0.1。 但1除以10,图1是 整数,10是一个整数。 所以当我们做一个整数除以 一个整数,我们要拿回 的整数。 因此,1除以10是0.1。 因为它需要给我们一个整数, 它只是要扔掉 小数位,说 答案是0。 所以当我们打印的答案, 这将打印0.00。 约瑟夫:而且,正如一个音符,它实际上 扔掉什么后 小数点。 所以,如果你不是有6除以10, 你可能会认为它会给你 0.6,然后你会四舍五入到1。 但实际上,当输入发生了什么 任务,那就是它滴是什么 小数点后。 所以0.6也变为0。 罗伯:是啊。 我们会说截断了点。 所以每当你强制转换为int, 小数将被截断。 因此,对于该修复 - 有 其实是两个。 而我要做的那一秒,因为 这个是一个很容易修复。 因此,一个解决办法是使用浮点数 在分裂。 真的,你只需要 让其中一人的持股量。 但它的有些只是更清晰 让他们都浮在水上。 因此,1.0除以10.0是 划分两个浮点数。 因此,答案最终会被 一个浮点数,所以你会 正确打印0.10这里。 一些不工作这么好 大约也就是,嗯,当然,这是很容易 够转换1至 通过使1.0浮动。 但是,如果不是我们有两个整数 如int x等于1和诠释y 等于10,然后我们想 以做X除以Y' 因此它是不容易的刚 做X.0什么的。 所以要修复被铸造。 所以铸件是用C来转换方式 从1变到另一种。 因此,这里,图1是一个整数。 并把这个浮在眼前 它,我们是铸造1为float。 所以这将转换 在1至1.0。 这将转换 在10至10.0。 然后事情的行为类似于 我们只是表明以前的版本 其中,符合市场预期,我们得到0.10 它会打印。 我们可以做到这一点 变量,也。 所以我们可以说,浮x 通过浮动Ÿ分。 约瑟夫:有问题吗? 罗伯:所以,就像在常规的数学, 我们有运算符优先级。 因此,在数学课上,你就更有可能 调用它的操作顺序。 在这里,官方用语是 运算符优先级。 但是,运算符优先级,或最 运营商,是你所期望的。 所以,就像在数学,2次10 将要超过密切分组 这10除以2,然后2。 操作的顺序,它会做2 次10,10除以2,然后 它会做20加5加2。 所以它的预期效果,您可以使用 括号把表达式分组。 你不能使用方括号 分组表达式。 是吗? 你居然能:喇叭5 只是回去一下吗? 你可以投一个int为字符串? 罗伯:那么在C中,你可以投什么 你要你想要的任何东西。 这并不意味着它是 一个好的事情。 所以,当你施放一个int到 一个字符串,即表示 - 我们将进入这个 更彻底 - 约瑟夫:晚得多。 罗伯:我不想很久以后说, 所以我试图改变我的句子。 我们将进入它更彻底 以后如果真的是当你有一个 字符串变量 - 所以一个字符串可以是任意 长,对不对? 我们一直在说,一个int 四个字节和long long是八 字节和浮子是4个字节。 所以一个字符串,就像一个int,只有 一定数目的字节到它的。 而这将是四个字节。 但一个字符串可以很 任意长,对不对? 等你好了世界上已经,如果这是10 字符或什么的,这已经 将要在4个字节 我可以放入一个字符串。 所以如何将字符串真正的工作是, 他们是在内存中的字符串 被保留。 所以在这里,当我说串X 等于的hello world,X里面是 只是说,哦,你好,世界存储 在内存中这个特殊的地方。 因此,如果我们尝试将整数转换为 字符串,然后我们试图解读 内存部分随机部分 作为一个字符串。 而且几乎总是打破的东西。 约瑟夫:但是,如果,混淆 您,我们将覆盖它 更深入的后面。 罗伯:是啊。 这就是你要去的地方 进入指针。 那就是显著​​块 二周课程的。 扬声器6:它的工作状物体 在其他语言或不是真的? 罗伯:那么在其他语言中,对象 会使用指针来表示。 这是不一样的东西,虽然。 有什么想法? 约瑟夫:号 没有思想。 罗伯:确定。 约瑟夫:下一步。 罗伯:刚去这一点。 好的。 所以模。 就像我们有加,减, 分裂和繁殖。 所以模是一个你可以 以前没看过。 它只是说,给 的我的其余部分。 所以55%10。 在做55的余数 由10将是5。 所以55%10 5。 和3%5是3。 8%8将0。 16%15将是1。 约瑟夫:有一点要注意这一点, 也就是它如预期可能无法正常工作 如果你使用一个负数。 因此,负5%4,有些人 可能会认为那就是 - 你会怎么想负 5%4会是什么? 扬声器5:一。 乔瑟夫:所以有些人说的, 有人说消极的。 但是 - 罗伯:我什至不会有 说其中的一个。 约瑟夫:二,对不起。 有人说 - 罗伯:三。 约瑟夫:三? 罗伯:负 - 究竟是什么 - 负5 - 约瑟夫:三,三,三。 抱歉。 因为模,通常,当你已经 看到它在其他地方,这通常意味着 返回一个正数,对不对? 罗伯:所以当我们说数学,10%的, 他们往往想给你 - 如果我们国防部10,那么我们预期 得到0到9之间的数字。 在这里,这不是这种情况,你 将得到负数返回。 乔瑟夫:所以负5% 4将是负1。 罗伯:但它是罕见的,你是MOD-ING 负数开始。 跳过此。 约瑟夫:是啊。 罗伯:MEH。 确定。 所以最后一件事要指出有关 彩车是它是一个危险的行为, 但花车是不是一个确切的 表示。 所以回到字节一遍,记住 那一个int总是有四个字节,一个 浮总是四个字节。 所以卢卡斯的例子是相当不错的。 因此,认为1除以3。 所以0.3333333。 如果我只有32位,怎么能 我保存0.33333到底是什么? 也许,不管什么原因,你说, 好吧,好吧,让我们只说 这个特殊的1011001,让我们 只是说,应该是0.333333。 那么,你只有有限数量的 这些位,所以这是不可能的 代表每一个浮点 鉴于只有32位值。 嗯,这是不可能代表任何 浮点值给出无限 - 还有,由于位中的任何数量有限。 因此,这里的问题是,好了,当我们用 打印到小数点后两位, 我们没有得到正确的答案0.10。 但引擎盖下,它是真正 被存储尽可能接近到 0.10那些位可以代表。 这是对下一张幻灯片? 或者,是不是? 约瑟夫:是啊,就是这样。 罗伯:Blegh,blegh。 约瑟夫:是啊,你可以只 拉笔记了一下。 罗伯:我只是要放大 中的最后一个上。 哦,我的天哪,这是[听不清]。 使数。 这就是将要打印 如果我们运行该程序。 并请注意,这不是一个真正的大问题 如果我们只关心像 两到三个小数位。 像我们最初只印刷0.10, 这就是为什么我们看到什么不对。 但是,一旦我们开始渐入 确切的说,确切的数字,它是 代表,我们看到,它不能 完全代表0.1。 在这里,问题的一部分是喜欢, 没事,这很好,但是,好吧, 首先,如果我们试图做的, 答案等于等于0.1? 是要返回true或false? 因此,这很难说。 我认为它实际上可能返回true。 它会先 - 我不知道。 答案是,一旦你开始处理 与浮点值,你漂亮 很多不应该使用相等 因为这种不精确性。 而对于所有你知道,它的百 小数位的 浮点无法 正确处理。 所以平等只会失败,甚至 虽然数 - 如果你已经 用确切的数字,该数字应 已经完全一样。 一切都结束了的像50的过​​程 使用这些浮动的计算 点值,误差可以建立 起来,起来,起​​来, 事情就出错。 约瑟夫:还有一直很 这种情况发生的著名的例子。 像美国航空航天局的工程师们获得这样的 错了,造成火箭爆炸的 他们已经发动后的空气。 和很多类似的问题。 所以,是的。 扬声器6:当你说0.3楼 它截断的休息吗? 抑或是一轮上涨或下跌? 罗伯:请问printf的圆吗? 约瑟夫:我认为printf的截断。 罗伯:确定。 所以,我们同样可以走向反面 这其中的方向,在这种情况下, 它可以代表最接近 0.1是用这个号码。 它或许能在最接近 表示0.2是在相反的 方向,0.199999996356 什么的。 所以,如果我们去的那个方向 的东西,然后printf的0.3 F.将返回 1.99,而不是2.00。 约瑟夫:我也完全不 确定这一点。 你可能想要写一个小的,小 程序只是检查。 罗伯:虽然,我们所肯定的是, 如果你试图强制转换成一个 int和铸造为int是要 导致它截断小数,如果 您尝试转换1.9999999 为int,您将获得1。 所以你通常应该使用 轮函数的数学函数库。 有问题吗? 确定。 乔瑟夫:所以,移动到条件 和布尔表达式。 所以,你以前见过这些。 而实际上,让我确保我 电脑是正确的格式在这里。 空间。 对不起,我们将不得不面对一个 与截止点点的边缘。 但是,是的,你们已经看到 这之前,在划痕。 所以这里这个权利是一个表达式 这是用来在 一个条件语句。 所以回答大于零的意志 告诉你,真或假。 这些都是非常重要的,因为 他们允许我们介绍 逻辑到我们的代码。 因此,例如,这是一个程序 写在刮,要求用户 为一个整数,并告诉他们是否 整数,他们给你是一个 正数或负数。 和转换在这里看到的是 你先打印出报表, 给我一个整数。 然后你问他们一个整数。 然后使用条件逻辑在 在这里,检查该号码是否 实际上比为零或不大于。 所以在这里,我们有一个布尔表达式 里面的条件If语句。 有什么问题吗? 是否有关于什么问题吗? 确定。 因此,有不止 比,当然,更大。 你可以构造布尔表达式 使用大多数的各种各样的事情你 会想到数学。 因此大于。 这应该是一个小于。 抱歉。 和间距。 罗伯:上帝保佑你离开它。 约瑟夫:好吧。 这样比,小于,大于更大 大于或等于,小于 大于或等于。 我们使用双等号检查 平等,因为单等于手段 分配,对不对? 是。 然后我们也可以不等于由 使用感叹号,等于。 而这个感叹号符号可以 也可以扩展,这样,如果你想 颠倒任何形式的布尔 表达式,你可以做到这一点。 因此,这将评估为true 只有当回答为少 大于或等于零。 上有问题吗? 确定。 所以,你也可以将这些 使用逻辑与和表达式 逻辑或。 所以,这只是和符号, 这应该是平移,7。 这是管道符号,这是 不是小写L.这是一个 这是正确的上方的Enter键。 所以你使用其中的两个象征 逻辑的逻辑或。 因此,这将只返回true,如果答案 是一个,两个,三个或四个。 这将只返回true,如果答案 超出该两侧。 所以它不是一个,两个,三个或四个。 并且你会使用的方式 在一个表达式 - 罗伯:或零或五。 约瑟夫:零或五。 抱歉。 是的,是的,是的。 确定。 而在这里现在,同样的方式,你 将使用该表达式,一个较小的 的如果条件表达式侧 声明中,你也会使用它 同样的方式通过只把它的内部 If语句的括号中。 因此,这将printf的只有火,如果答案 是一个,两个,三个或四个。 结合上有任何问题 表达式? 因此,有另一个条件 构建体,我们称之为一个if / else语句。 所以基本上,这意味着现在好不好,如果 我想要的东西,检查是不是 真的,然后去Else和 执行其他动作。 因此,在这种特殊情况下,我问 用户的一个整数。 是大于零的整数? 是吗? 好吧,那么他们选 一个正数。 如果没有,那么它必须有 是负或零。 所以,你选择了一个负数 或者在此情况下为零。 是。 或零。 然后我们也有if / else语句, 如果和其他人。 因此,这可以让我们执行的顺序 事情只有首当其冲失败。 因此,在这种情况下,我们现在正在做的 最后一个你挑为零。 所以,如果他们既不挑了积极的,也不 一个负数,那么他们必须 纷纷拿起为零。 因此,它只是下降的 链条是这样的。 如何在这样一个例子 如果是从不同的 - 一个if / else语句是不同的 只是一个序列IFS的。 这是一个常见的​​问题, 人们问的是,好吧,如果你得到一个像 95 CS50,又会此 程序告诉你吗? 扬声器5:你有一个A。 约瑟夫:是的。 你得到的每一个 其中的一个权利。 你有一个A,你有一个B,你 得到了一个C和D,对不对? 因此,所有这些得到评估 为了。 因此,虽然95大于90,它的 比80也更大,这也是 大于70,它的 也大于60。 所以,你得到了所有这些成绩的。 我相信,你会 只希望A。 要解决这一问题的方法是更换 那些否则/如果的。 所以在这种情况下,它看到的是95 大于90,然后它 不评价其他地区 的语句。 关于什么问题吗? 因此,有另一个条件排序 结构,我们在这里,我们 调用一个switch语句。 因此,这可以让你基本检查 怎样的一个数字,你把价值 进入switch语句。 所以在这种情况下,我们切换 于n,和我们说,哦,如果n为 一个,然后打印该报表。 再突破,这意味着退出 出了switch语句。 如果它不是一个,那么,很好,只是 最后检查所有的这些情况。 所以它会检查是否它的一个或两个或 三,它打印相应。 什么这个默认的关键字到这里 方法是,如果他们没有进入任何 那些,然后说无效。 因此,让我们说,我问n和 用户给我四。 那么,它没有匹配的那些情况下, 所以它会打印出什么在 默认段。 是的,质疑? 扬声器5:你可以使用布尔 表达式代替 一个,两个,或三个? 乔瑟夫:所以,问题是你能使用 布尔表达式,而不是一个, 二,三? 而在C中,我相信你 不能做到这一点。 但在其他语言中,你可能会 在遇到的结束 学期如JavaScript,你可以。 那么,你就必须先计算 该值,然后使用它在 switch语句。 是吗? 罗伯:开关部分的利益所以 报表是想,如果你这样做 作为一个if / else语句,所以如果n等于像 等于一个或什么的。 其他/如果n等于等于二,什么的。 其他/如果n等于等于三。 这样的方式,程序将运行的是它 会按顺序往下走的列表 并检查是N吗? 不。 为n 2? 不。 为n 3? 是啊。 做到这一点。 而用switch语句,它的 居然能够编译它是 真快。 而一旦它说开关,它 说,没事,n为2时,我 马上要跳的地方 我应该开始执行。 我不会先检查, 为n之一,N双? 它可以立即开始做 什么是应该做的。 正因为如此,它不能 采取布尔条件。 否则将不得不这样做的 顺序一样,所有的权利,为n 大于零? 否则为n大于10或任何更高。 约瑟夫:在这种情况下,如果你使用 if / else语句,如果的,则开关会 运行约3倍 比的if / else,如果速度更快。 我们可以组织开关在这样的 我们不分手的方式 之后每个案件。 因此,在这种情况下,我分隔 我们选择到一个和数字 两个是不高的数字和 三位的是大量的。 因此,在这种情况下,如果n是1或2,它 会打的情况下,然后它会 告吹,因为 没有休息。 它会在这里结束。 因此,如果我们挑一个,它会做的printf 然后突破,这样的无 这被执行。 当然,如果他们在三个进入 还是其他什么东西,然后它会跳过 这些,而不是去那里,它 将执行的,而不是 相应的行。 是否有关于什么问题吗? 是吗? 扬声器4:你会得到一个错误,如果你 有情况下,一前一后休息,但它 没有东西给它做? 乔瑟夫:所以,问题是,你会得到 一个错误,如果你有后休息 案例一但有什么可以做? 答案是否定的。 你不会真正得到一个错误。 是啊,毫米嗯。 作为排序的那么一点点这里的变化, 我打算把一个printf这里。 哎呦。 那么,什么会这样,如果打印 我把一个在输入? 是啊。 它会告诉你,它没有考虑 高数的两倍,对吗? 因为它会打的第一种情况下, 它不会打破,一下子就摔倒 通过向所述第二壳体。 关于什么问题吗? 罗伯:你有别的问题? 约瑟夫:好,冷却。 好的。 因此,有我们所说的别的东西 三元运算符这基本上是一个 替代语法干嘛 如果再别的。 它可以让你做这一切在同一行。 所以这个特定的程序中, 我问n的用户。 如果n大于100时,我告诉 他们,他们选择了一个高的数字。 别的我告诉他们,他们 挑一个低的数字。 因此,我们可以用这个很长的语法, 字符串,S,然后检查是否n是 大于100,并分配 它相应。 但是,我们可以让这个更简洁 通过使用这个三元运算符语法 其中涉及的问题 标记和一个冒号。 所以问号本质上是 问一个问题,对不对? 罗伯:或许放大了。 约瑟夫:是的。 好点。 因此,这是三元运算符。 我首先要问的问题, 为n大于100? 如果是,那么我执行第一 冒号前的部分。 如果不是,那么我执行 在冒号后面第二部分。 因此,如果n大于100, 然后挑选高,看跌期权 那到字符串s。 如果n小于100,它选择低 进而提出了到字符串s。 因此,将这种凝结大块 成只是一条线。 扬声器5:这是流行? 约瑟夫:是的,这是很流行的 那里基本上你要的东西 做基于任务 某种条件。 在这种情况下,我们试图 到一个值赋给字符串s。 这不是那么 - 我想我真的不喜欢 但在其他情况下。 但它是特别有用 对于这项任务。 罗伯:这是一个很常见的模式 在那里你有一些变量, 你会说,如果事情,设置 该变量为一个值,否则,设置 此变量为另一个值。 那就是场景 其中使用三元。 约瑟夫:你是在救 很多行,对不对? 它只是使你的代码可以说是 更可读的一点点。 是的,质疑? 扬声器6:对于三元,你能不能去, 字符串s等于S,问号? 然后你可以有,比方说, 五个不同的选项。 以及根据什么n的数目 是,你会选择其中的一个? 乔瑟夫:所以,问题是,有没有 排序语法,你可以做字符串 s等于n,并且随后有两个以上的 那个问号的选项? 而一个简单的答案是否定的,有没有 真是一个好办法做到这一点,除非 要嵌套多个三元 彼此的内部运算符。 你可以做如:n大于100, 问号,然后再 三元运算符中,n大于50, 问号,巢这种方式。 但在这种情况下,你的代码是 得到一种不可读和凌乱, 它可能是更好的只是去 一个if / else语句在这一点上。 罗伯:还有,作为一个侧面说明,PHP 不正确地实现了三元 运营商这样嵌套的三元系 甚至不工作,因为他们应该。 约瑟夫:是啊。 因此,它变得有点混乱, 尤其是当你去 以不同的语言。 罗伯:这是迷惑,以至于 语言是错的。 乔瑟夫:所以其实只是为了澄清, 每个人都知道那是什么 %s的确实在这里? 关于什么问题吗? 我猜只是相机,%s的 基本上让我们放一个占位符 为一个字符串。 然后到了最后,我们指定的 变量,我们希望把这个 占位符为s。 所以,基本上需要s 它把它在这里。 然后它会打印出来,你挑 高或你选择了一个低的数字。 确定。 所以循环允许你执行的事情 在打圈,对不对? 你可能会在遇到此 在从无到有的永远的形式循环 或重复,直到或重复特定的 的次数。 那么,为什么这是对我们有好处? 那么,在C中,假设我们有这样的 在刮歌实施了 唱歌,这是歌曲 永远不会结束。 它只是和和 永远,永远。 好了,你真的不能让一个程序 具有printf的无限数量的 在它的报表,对不对? 因此,在这种特定的情况下,单程 您可以进行这项工作, 让它永远印是 而不是使用一个while循环。 因此,一个While循环将执行什么 在两个支撑体是 属于它的依据是什么 条件是。 因此,在这个特定的例子之前,如果 我们要永远的打印本,有什么 也许我们做什么? 嗯,当然,对不对? 所以,这样的结合的想法 一些布尔表达式 随着循环。 我们了解了布尔 表达式前面。 所以每当里面的条件 这虽然仍是如此,这个循环 将执行上和和。 在这种情况下,如果我们只是提供了 与真实的,这将导致无限 循环打印出的歌曲,并在 和我们之前没有期望 具有一个程序,有无限 的printf语句数目,这是 不可能的。 所以更令人信服,不过, 你可以使用这个用 变量和条件。 因此,让我们说,我们要重复的 词组,完全充满循环,10倍。 所以,你可以用一个While循环做的是 你可以先初始化一个计数器 变量以外的 While循环到10。 然后基本上,每次你走 通过While循环,打印出 您降低语句,然后将 计数器变量,直到在最后, 在某些时候,当我们减去我不够 次,1次从我足够的时间 - 而只是为了澄清,我减减 意味着我等于I减1。 这将基本上把我下到 点,一旦我打零,这 条件不再真实, 所以它退出圈外。 所以完全充满循环只打印10倍。 关于While循环有问题吗? 确定。 因此,有一个办法,我们可以做什么,我们只是 在一个更简洁的方式与做 我们所说的For循环。 因此,一个For循环由一个 初始化的状态下,和一个 更新,就像我们以前有 在这个While循环。 因此,让我们一起来看看。 在这个while循环,我们有 初始化,然后我们有一个 调理,我们检查。 然后我们有一个更新 步骤在顶部。 在fo​​r循环中,这主要取 这三样东西和它凝结 成一行。 因此,它确实在的第一件事 for循环的初始化。 然后,你做一个分号,然后 你做的条件,这是我 大于零去那边, 然后在更新步骤。 因此,这被在执行 循环体的最后一刻。 所以,这两个程序是 基本上是等价的。 有问题吗? 那么,什么是一个区别 这两者之间? 任何人都可以指出来? 它可能是一个有点微妙。 这只是一个非常小的差异。 是吗? 扬声器5:您将无法使用 For循环外的我变 [听不清]? 约瑟夫:没错。 所以,这是我们会得到 后来被称为变量的作用域。 但本质上,这种诠释我的生活 这个while循环之外。 所以一旦这个while循环完成 执行时,我就可以在以后使用我 在该程序。 而用这种For循环,这个INT I 作用域是这里面的for循环。 并且,因为它是该部分的内 For循环,即启动 在括号和结束 大括号那边。 这就是内声明的任何事情 这里不能被外部使用。 所以,如果我尝试使用外我,它会 告诉我,未申报的象征。 而且基本上,我不会 能够使用它。 罗伯:和好了,10年前,在 从字面上所有的情况下,大括号 你用什么来确定 一个变量的范围。 所以在那里,INT I等于10 这里面声明 设置大括号。 所以这时只要您尝试使用我 这个大括号之前,它的罚款。 当你键入make您可能会看到,你 看破折号,破折号,标准,等于和C99。 所以这是C以后的版本, 海湾合作委员会已实施也给 此快捷方式。 因此,这用于不能在C.允许和 你可以看到为什么,因为这个整数 我是这个大括号之外,但 它仍然被认为是在 这些大括号的范围。 但是,这是一个非常方便的事情, 所以它是一个很好的延伸。 约瑟夫:有问题吗? 确定。 那么什么是更有益的是,有时 你想在那种活力 你的循环,对不对? 你不想只是必然打印 完全糊涂的所有的时间,你 要从倒计时 10什么的。 所以你可以使用计数器变量 那里面循环的为好。 在这种情况下,本程序只是 倒计时从10一路下跌下来。 它有什么不能打印? 它不打印零, 没错,因为当 - 是的,它也不会打印11。 因此,它不打印零,因为当 我是零,请记住,它会评估 之前那张条件 执行循环体。 当我是零,这是假的,所以 它不会打印出倒计时 零,它只是打印出票 跌10一路下滑至1。 如果我们真的想要它打印为零, 然后我们会把等号 比后签订本更大。 确定。 因此,一个办法做到的输入验证,这 是当你问用户做 什么,你要确保他们 按照您的指示,是使用 While循环,对不对? 因此,在这种特殊情况下,我在问 为正数,那么我 等待输入。 然后我检查而输入 小于零,不断地问他们。 所以只要他们给我一个号码 这不是积极的,不断地问, 不停的问,不停的问。 但是,什么是有点儿奇怪这件事? 或似乎有什么不理想有关 这种结构在这里? 任何人吗? 是吗? 扬声器6:你重复 该指令的两倍。 乔瑟夫:对。 因此,我们有两个printf语句 在这里,对不对? 因此,有一个办法,我们可以得到这个刚 下降到一个会令我们的 代码更易于阅读和 更干净一点。 然后我们就不必 已取得在两次为好。 你也可以做到这一点的方法之一是 通过使用一个do-whil​​e循环。 和do-whil​​e循环基本上是一个 不同形式的While循环在哪里 无论是在大括号内 被至少执行一次。 所以在这里,我宣布,整型 输入外第一。 然后,我只是说,这样做 指令同时输入 小于零。 所以,它击中先做。 它总是至少执行此 一次,所以它总是会询问用户 对于至少一次输入。 然后它计算的输入, 并且它继续了一圈。 是的,质疑? 扬声器6:有没有办法做到这一点 [听不清]的类型,如果你说喜欢, GetString的,有人[听不清] 是有办法[听不清] 乔瑟夫:所以,问题是,有没有 这样做的输入验证,如果用户 不把正确的 变量的类型? 因此,如果我们要求一个int和他们 给我们一个字符串来代替。 而在我们实现的功能 对你来说,调用getInt是,GetString在所有的 这些功能,他们实际上已经 做那种基本类型的输入 引擎盖下验证。 所以,如果你正在使用的功能,我们 给了你,你真的没有来。 但是,如果你想看起来更探讨如何 你其实可以做到这一点,你可以看看 罩在文件下I/O-- 不是一个文件,标准I / O函数 像一个从标准输入读取和 标准输出。 你可以得到一个更好的感觉 您可能如何做到这一点。 罗伯:有一个问题,虽然是专门 用你的例子 说,你期望一个字符串 而我进入一个int。 你将如何分辨 故意想要的 串123对想要整型123? 这样的字符串,它几乎没有 验证,它只是不管他们 进入你将圆梦 作为一个字符串。 int是比较容易的,因为不管 输入你从用户,你是 始终以一个字符串。 所以该字符串就可以再 检查一下,是所有这些 实际上位数字? 约瑟夫:确定。 大约一个do-whil​​e循环有问题吗? 罗伯:哦,这也是 - 回去范围,一个比较常见的 错误是试图用一些当地的 从这个的do-whil​​e中变量 循环的这种情况下的内部。 而实际上,如果我们只是摆脱了 这一点,并说,INT输入等于 调用getInt,那么编译器会骂 我们,因为输入不存在 的范围之外的 这些大括号。 约瑟夫:这就是为什么我们 需要这样的阵容在这里。 确定。 所以你也可以打出来的 循环初期,如果你想。 所以这是一个不同的方式 实施我们刚刚实施。 和,而不是使用条件 在括号内,我们使用了 如果身体的内部表 在do-whil​​e循环的。 基本上,当输入最后 大于零,我们将 跳出循环。 因此,我们将全力以赴 一路下来这里。 而且你可以看到这会 可能是优选的这 情况下,因为它是一个小 有点清洁和一点点 位更容易阅读。 而这一类的,你 有多余的线条在里面。 这只是一点点丑陋, 我猜想,在某种意义上。 是的,质疑? 扬声器4:将仅获得突破 你出一组大括号? 乔瑟夫:对。 所以,问题是只破 让你出一个循环的? 答案是肯定的。 所以,如果你有嵌套的For循环,对于 举例来说,如果我有整型I等于0 直到10然后对于int j为0 直到10,如果我打出来的内在的 环,我还是会去 到外循环。 所以它会继续执行 操作在外面。 关于什么问题吗? 是吗? 扬声器5:但只有突破功能 对大括号,而不是其他 报表? [听不清] 乔瑟夫:所以,问题是将打破 唯一的功能for循环,而不是 其他语句一样,如果? 是的,是这样的话,因为 你打破一个循环出来了吧, 在感。 罗伯:在案件的绝大多数,这是 这是如果某样东西的那种, 然后打破。 所以,你不必打破申请 的如果是环绕着它。 而且,这并不是太大的环, 但请记住,开关也 通过断裂破碎出来的。 我们看到正在使用的中断 与切换前。 约瑟夫:你也可以使用它们 在While循环和for循环。 有问题吗? 确定。 所以,接下来是功能。 所以,你可能已经使用了这些BYOB之一 块,将刮项目。 这基本上可以让 您可以定义一组 指令被执行。 而我的意思是让我们觉得 回到数学,右,代数。 你有什么我们称之为x的函数, 一些变量,并假设本 函数是f的x等于x加5。 所以,你能想到前后x的,因为这黑色 框取15,然后 生产20。 所以更一般地,一个功能是 的东西,需要一些投入和 然后产生一些输出。 以及为什么是功能好? 他们是很好的为一定数量的原因。 因此,没有人想采取刺 在组织什么意思? 在为什么功能方面都是有帮助吗? 是吗? 扬声器4:它使你的 代码更具可读性。 乔瑟夫:对。 这样的事情之一是它使 你的代码更易读,对不对? 而不必像诠释x等于x时 次x次X,我可以得x的立方, 这是更具可读性,更 可以理解的读者。 组织也是来讲 把您的代码转换成可管理的 部分,因此,与其试图 实现这一切在一个长款 在主,你可以有点分裂它 成想,好,让我们写一个函数 多维数据集的东西,让我们写一个 功能为方形的东西。 这样,你可以把它分解成微小的, 小部分,你可以解决 而不是试图解决 一个很大的问题一下子。 罗伯:甚至微小的,小零件 你和你的伴侣可以解决。 约瑟夫:是啊。 罗伯:所以不是两个 你想植入1 功能的同时。 约瑟夫:简化。 有人想以此来猜测? 是吗? 扬声器5:更多的重复。 乔瑟夫:对。 这样一件事,你可以做 简化是它的排序上 相同的线作为可重用性是 有一次我写一个立方体函数,我可以 刚刚使用过,并一遍又一遍 又在我的程序,而不是打字 x次x次x在和 一遍又一遍。 和简化在这里也只是 意味着它使你的代码排序 一旦你分割更容易调试 这成函数。 因为这样你可以在那里本地化 排序您的问题。 有问题吗? 所以另一个想法是抽象的,对不对? 这个黑匣子。 就像你知道什么调用getInt呢 以接收来自用户的输入? 我们还没有真正告诉你,对不对? 所有我们告诉你的是调用getInt呢 正是它说,它的作用。 所以,即使我们不告诉你如何 它的工作原理,你还是知道的。 因此,在这种特殊情况下,这是 四重功能,不 不同的东西来输入 以产生一个输出。 而且你可以翻两番一个数字 通过将其乘以4。 或者您也可以就是我们所说的 位由两个移动它。 我们将讨论这 一点点后。 而且也没有必要知道如何 函数实际上只要工程,它 诚如作品。 于是在引擎盖下,我可能是 像,返回输入倍 8除以二。 而你不知道吧? 所有你需要知道的是, 它做什么它说。 所以这是有用的东西 关于抽象。 而另一件事是有点这样的想法 定位你的代码之一 特定部分。 所以,如果你有一个问题,你不 要走遍你的代码试图 解决那里的问题。 因此,在这种情况下,我实现 立方体错误的。 我想多维数据集乘以 三。 所以在这种情况下,这是一个程序 只是已经由三个相乘 无处不在。 而且,还有另一个计划,有 保理立方体出成一个函数。 所以现在如果我想解决我的错 在这里,我必须要修好每一行 这个程序的代码。 而在另一方面,如果我用 功能,我只需要改变 在一个地方发生了什么事。 因此,在计算机科学中,我们 调用的输入和输出。 输入被称为参数或 参数,并输出被称为 返回值。 我们将看到如何这可以帮助我们理清 在第二个定义一个函数。 所以这是一个函数定义 对于体积测量。 因此它需要一个输入,然后 它返回一个数字时代 本身三次。 因此,让我们打破这种分解。 所以我们有一个函数头,其中 基本上由三件事情。 所以,我们有参数, 是,正如我前面所说的, 投入到这个功能。 然后我们给函数的名称。 在这种情况下,它被称为多维数据集。 然后,我们指定哪些类型 的返回值是。 所以在这种情况下,我的立方体函数 取入的整数,并且它也 返回一个整数。 所以,如果我通过在二,二是整数, 它返回八到我,这 是一个整数。 因此,返回类型名称参数。 有关该问题? 然后返回值实际上是 在最后说指定的回报 然后回到什么 包含返回值。 因此,在这种情况下,如果我们把它全部 同时,一个函数接受 参数,这就是所谓的东西, 它返回的东西是类型 我们说这将是。 有问题吗? 那么,我们如何使用函数? 好了,我们写一个函数,然后 我们用它在我们的计划,对不对? 所以我把它称为多维数据集, 然后我可以使用多维数据集。 但重要的是要注意 就是为了事宜。 如果我有以下主要的立方体,它的 要碰上立方体。 在这一点上,没有什么 所谓的魔方程序中,它的 只是要像,我有 不知道什么是立方体。 因此,它会告诉你,隐 声明的函数。 这显示了错误。 所以在这种情况下,立方体低于 主要的,所以它不会 来了解一下吧。 扬声器5:所以主要是通常 最后一个函数定义? 乔瑟夫:所以,问题是, 是主要的通常是最后 你想定义的事情吗? 并没有。 这是因为我们通常喜欢主 要在顶部,对不对? 因为这是第一件事情你 希望程序员打开 程序,看看。 所以,我们如何解决这个问题,我们 想主要是在顶部,但 我们想要的功能,我们希望他们 将低于主还能够使用 他们的主要内? 好了,我们用我们称之为 函数原型。 那么,什么函数原型本质 是被它首先需要什么 签名或函数头 什么我们要实现下降 在这里,我们把它放在 一个程序的顶部。 因此,在这种情况下,我们说,好了, 后来在我们的节目中,我们将 作出承诺来实现这个 函数调用整型立方体,这需要 一个整数输入。 所以,现在,因为那是上面的主, 主要的,它会说,哦,好吧, 在节目后,也将是 有这样我就可以参考它,所以我会 就让它通过去现在。 然后在底部, 我们实现的立方体。 然后主只想说, 好了,它会进行排序的链接 这两个符号在一起。 我们将讨论是什么 意味着以后。 所以它会知道,这是 立方体函数,它应该使用。 罗伯:在[听不清]关于希望 主要在底部或 顶,我见过两个。 有些事情,就像 把主要的底部。 但是,一旦一个项目获得特别 大,平时主要是在 提交自己的所有。 在这一点上,如 整型立方体线会 - stdio.h中里面是一堆 就这样整型行 立方体整型输入线。 等等这些原型都是你 往往投入的头文件,在 这一点,也没有关系。 好吧,没关系。 那些总是在顶部。 如果主要不是一个文件自身所有, 你不必担心这会让 个别函数原型 在文件中。 约瑟夫:我们会得到一个小 位后,当罗布开始谈论 有关编译。 所以还有一个区别 之间的参数和参数。 和参数正是 我们称这些投入时 我们定义函数。 我们把它叫做一个参数,当我们 实际上它传递到函数。 所以在这种情况下,这是一个参数, 正如我们之前所说的。 而当我们真正使用它在那边, 的x立方体,那么X本身是 我们所说的论点 该函数的立方体。 罗伯:所以参数的论点是 - 有这种区别,很 交替混淆。 在这一点上,对我来说,它就像一个 那些话,当我看到它在 野外,我不禁马上 质疑他们是否在使用它 正确的上下文,因为 差足够细微,仅仅 每个人都倾向于 - 我几乎总是说参数 不管我是什么意思。 约瑟夫:和功能也很有用 对于我们所说的副作用。 因此,一个函数可以不取输入,并 它也可以不产生输出。 因此,在这种特殊情况下,我 定义一个子程序,有没有 返回值。 并且为了指定这一点,我们使用 我们称之为无效在这里。 因此该函数的副作用 是,它只是打印的东西 出到页面中。 它实际上并没有采取任何 输入,并且它不 实际上产生任何输出。 但是这可能在这个意义上是有用 如果你想,例如,调试 东西在你的程序中,如果你想要 写一点子程序 打印出来,让我们说,内容 内存什么的。 等等这些副作用是有时 上下文之外有用 只是想输入和输出。 有问题吗? 并结束这个特殊的领域, 这是什么节目呢? 我给你们一对夫妇 秒读通过它。 在一个非常基本的水平,我们要 说的是,它交换x和y,对不对? 所以,你们有多少人真的认为 这将交换x和y? 举起你的手。 没有之一。 确定。 谁认为它会 不会掉x和y? 和该总和是 不是整个房间。 所以有些人不知道。 确定。 这是合理的。 所以,让我们通过会发生什么时, 你实际上调用函数首先在 为了回答这个问题。 因此,这是什么内存 那种样子。 这有点像一个简化模型 的记忆是什么样子时, 你运行一个程序。 因此,有一种叫 堆栈下来这里 一种叫做堆。 而这些对成长 的存储器的中间。 因此,在这种特殊情况下,当 你调用一个函数,它 被放在堆栈上。 然后无论是包含在 功能停留在我们所说的 函数的堆栈帧。 等拿到一个不错的可视化 对此,let's - 例如,我们有 程序主要更早。 和主里面,我们称之为立方体。 所以主要会先进入堆叠 框架,因为它是第一个函数 这就是所谓的。 然后当立方体被称为内侧 主要的,它被放在主顶部 内的存储器中。 所以,你会发现这里是立方体 有它自己的参数和其 自己的本地人。 所以,当你真正传递的东西 一个函数,参数,它 得到是什么副本 从主要的传递。 和排序来解释这一点,让我们 走过一个程序。 因此,我们有栈,这是 只是部分堆垛。 而我们要做的是,我们首先初始化 x和y为一个和两个。 因此,我们有这些小盒子。 他们坐在主的堆栈 框架堆栈上。 它们含有一个和两个。 现在,我们称之为交换。 什么情况是我们通过x和y成 掉期,掉期和创建自己的副本 这些变量里面使用 它的堆栈帧。 所以,现在在那边,我们有一个,这 包含x具有的值,以及b, 其中包含使y的值是。 这样的一,二。 而且你会发现,这是独立的 从x和y的主内。 所以我们现在创建一个临时的 变量包含。 我们设置一个等于b,那么它 变化从一到两个。 然后我们将b等于 到温度,这是其中之一。 然后现在我们退出了 这个功能。 当您退出功能的出去, 堆栈帧被弹出堆栈。 我们称它推。 你推一个栈帧压入堆栈 而你若弹出从堆栈中。 所以会发生什么事是一切 是刚才那个堆栈帧排序 上升在火焰中。 所以不再存在。 但是,我们注意到了吗? 我们从来没有真正改变 x和y的值,对不对? 所以那些地方呆主。 并通过传递东西掉期,我们 其实从来没有改变这些值。 而我们称这是什么? 我们按值调用这个传球。 所以在C中,当你通过东西进入 功能,它通过它们按价值计算, 使他们的副本 该函数使用。 我们将了解一些所谓的 通过引用传递后,但是这 一种方法可以解决这个问题。 但我们不会担心 那直到后来。 罗伯:而实际上,这个词,传递 通过引用,所以C甚至没有 路过的参考。 Ç已经完全经过值。 不管你做什么,你总是 路过的一些副本。 它只是说,像我样的提 之前的指针 和一个字符串确实是只有四 字节指着某处在内存中。 好吧,如果我有这样的字符串,它的 告诉我,是其中的字符串 - 好吧,如果我有这个指针指向这个 放置在内存中,然后我可以通过一个 该指针指向一个函数的副本, 该功能仍然知道在哪里 内存是。 所以,这两个指针都指向 内存中的同一个地方,和 这就是我们要如何才能够 修改以后的事情 当前堆栈帧。 约瑟夫:你们想干什么编译? 罗伯:不,这是5:30。 约瑟夫:确定。 它是5:30。 确定。 因此,我们将覆盖编译我猜 下一节,或者你的节 领导者会在这一点上。 和 - 罗伯:有问题吗? 约瑟夫:有问题吗? 是吗? 喇叭5:使用从CS50,任何字符串 我们要使用的功能 这些,那将是像C函数。 CS50并没有消失在和 做任何额外的。 罗伯:正确。 任何的C状[听不清],您 会使用那些在我们的字符串。 约瑟夫:最后一件事我想 一提的是,我们有一个风格指南 这个类。 罗伯:哦,是的。 乔瑟夫:所以,如果你来自一个 前编程背景,你 可能有一定的约定,当 你写的代码就像把 在同一行或特定括号 缩进方式 或命名变量。 在这个类中,我们要遵循 具体风格指南只是因为, 好吧,如果你出去工作的 行业,你会在意料之中 遵循的风格指南 公司在这你去。 像例如,Facebook的我觉得 已命名的特定排序 约定。 还有的骆驼之间的差异 外壳变量和像 他们用下划线分隔。 而且,我认为最重要的是,像 例如,压痕,对不对? 我们花括号开始的地方 的条件是,它们 是从下一行的。 而我们也把花括号中 即使是只有一条线。 而很多时候,有很多方法可以做 它在那里你可以将这些括号 如果是只有一条线断 下的If语句。 但在这个类中,我们要遵循 具体风格指南只是让你得到 用之类的事情。 罗伯:是啊,50款将要 执行本风格指南,我们很 要使用样式50 分级代码。 因此,它使事情变得更容易为我们和 希望不要把事情说 为你提供了很多糟糕的 标准化的风格不应该是 不现实的。 约瑟夫:最后,找到风格 引导,去manual.cs50.net/style。 ,是的。 扬声器4:你要强制执行 每行的所有字符? 罗伯:是的。 约瑟夫:对不起,伙计们。 罗伯:这就像唯一的一个。 在这一点上,我与120确定。 我跟说120行 每行的字符。 据我所知,被一些限制。 我觉得80是如此之小,但 我们正在执行它。 约瑟夫:我个人认为,用 C,80个字符是比较确定。 一旦你开始给其他 语言如JavaScript和PHP,不 所以合理的,只是限制 它为80个字符。 确定。 嗯,这是超级节。 有谁要糖果? 扬声器4:是的。