ROB BOWDEN:这是 更舒适的节, 但是,这并不意味着,如果你 觉得你是不是更舒服 你不会学到的东西在这里。 因此,让我们开始吧。 你有滑梯 直入事情。 难道我只是把它的权利吗? 开关笔记本电脑。 艾里逊:你不想要 自我介绍一下,罗布? 罗布·鲍登:哦,我抢。 这是我的第五个年头TF-ING CS50。 GABRIEL:我是加布里埃尔。 我是CS50的头TF。 我是TF在去年和今年。 艾里逊:我是艾莉森,这 是我的第二个年头TF-ING CS50。 罗布·鲍登:好吧,那么 这个东西在左边, 希望你以前见过它。 如果不是因为你 下载为自己, 你应该已经看到了在课堂上。 所以这是CS50家电,和他 做了一定程度的相关描述 在演讲。 但基本上它只是你 正在运行的操作 您的操作系统中的系统 系统,使我们可以给你 无需计划 不用担心哦是这样的 上班在Windows上 和Mac,或者如果你们中的一些 已经使用Linux,Linux操作系统。 这只是应该 是一种常见的演奏 字段,以便每个人都有 完全相同的环境。 所以,如果你还没有 下载了这个已经, 你应该下载它,因为你 会需要它的习题集。 并且它是一个2千兆字节 下载,所以它可能需要一段时间。 在哈佛,它会走的快。 所以CS50设备。 现在,在开始的时候,我们要 说说只是一堆命令行 的东西,所以通过这一点,我的意思是工作 在这边这个小环境。 并注意所有的东西 我说就在这里,现在 会,如果你的内部工作 组件内的端子, 或者,如果你是内 在gedit中终端窗口 内的器具的。 所以这些环境是相同的。 但我会去三分之一的路线。 并注意倒在这里 这里有点IP地址。 所以,你不必 做到这一点,但这个IP address--现在如果我 - 除非 它阻止这件事情。 OK,这样IP地址 过在终端 这里 - 所以这个终端上 这里是我的Mac终端。 因此,这是目前没有办法 与设备在所有相关联。 如果你使用的是Windows,那么你 将需要下载的东西 专门为此,特别 人们往往用腻子,P-U-T-T-Y。 所以,我什么都做的是类型 SSH和然后该IP地址。 好吧,jharvard在该IP地址。 所以192.168.24.220。 这个可怕的消息,忽略它。 只需输入yes。 这是CS50在一个盒子里。 它会询问你的密码。 所以在很多这些上下文中的 它要求输入密码,[听不清]。 我们已经得到了很多的问题在哪里 它说,它实际上不是打字。 它不会告诉你的人物 密码在您键入,如果有的话, 对于一个安全功能,因为如果 有人找你的肩膀上 他们看到明星明星 明星星,那么他们 知道你的密码 是四个大字。 这样的想法是它会询问 您的密码,请键入。 它不会显示 你的字符, 但它实际上是接受他们。 在这种情况下,任何时候你 曾经看到一个密码提示 处理设备,所述 密码将是深红色的。 所以绯红。 现在这里的这里面 窗口是在我的Mac上, 我基本上有 完全相同的看法 作为终端的内部 在产品中。 所以,你不必这样做。 你可以做一切你 希望该设备的内部。 我几乎从来没有真正做 任何在产品中。 我几乎总是最小化,现在 我正在通过SSH进入组件。 如果有什么事情,如果你 具有较慢的计算机, 你可能会注意到一个区别。 我这样做是因为我喜欢 这个终端窗口。 它有像某些功能 我可以分割窗口, 现在我可以SSH方式 通过设备。 我有两个SSH的一次事情。 如果你的电脑是特别慢 和你的工作在家电, 你知道这是 真的laggy,等等。 往往要快很多 如果你是SSH-ED英寸 但除此之外,你可以工作两种方式。 听众:什么是SSH是什么意思? 罗布·鲍登:安全壳, 类似的东西? 什么是SSH是什么意思? GABRIEL:安全壳。 艾里逊:这只是安全壳。 罗布·鲍登:安全壳。 这是一个协议,你 - 这是 安全协议,从而进行加密。 让人无法窥探的网络 看到你说要什么有什么 你是SSH-ED来。 而事实上,在古代 CS50的日子,因此在2009年 当我还是个大一的方式, 你曾CS50习题集, 是你的SSH-ED一些服务器 我们给您访问, 而你的工作在那里。 所以,你没有这个 图形设备。 你没有gedit中。 你没有这些东西, 你可以视觉化的指向和点击。 你有这个接口才能正常工作。 我更喜欢在此界面中工作。 那么,我们要的一部分 将要在现在 一堆的 命令,你应该 开始熟悉的 你在使用过程中走。 而且说实话,当你 习惯了,它 这么多快 在这种环境中工作 比它与取景工作, 拖动和点击的东西。 所以,我们在这里。 现在我只是SSH-ED在等 默认location--你 看到了一些在课堂上这些命令, 但我们去了所有的人了。 默认位置我们 在是主目录。 和目录,只是 另一个字的文件夹。 所以我们在主目录中。 输入ls,列出文件 在这个目录中。 显然,我创建了一个blah.c更早。 因此,我们有一个桌面目录。 你注意到了语法高亮? 淡蓝色的高亮显示 目录和直白 表示只是一个纯文本文件。 所以有将要 你看到一些其他颜色。 一个可执行文件,很可能会 是绿色的或类似的东西。 好了,我们是在主目录中。 现在,如果我想进入一个不同的 目录中,CD是我想要的命令。 所以,改变目录,然后你 通过该目录的名称 你想进入。 所以在这里我们有四个选项。 我可以进入下载了,现在我们看到的 这里已经更新了这个括号 说我在〜/下载。 那么,什么是波浪? 这是一个简写 你的home目录。 所以,你做的几乎一切都会好起来 是相对于你的home目录, 和PWD只是一个命令 我在一年使用一次即 只是打印当前目录。 所以你看这里 〜/下载真正解决 到/ home / jharvard /下载。 因此,/家用/ jharvard是我的主目录。 因此,我们可以CD点点。 现在,点点是一个特殊的目录 总是指一个目录了。 所以,如果我在〜/下载,那么CD点 点是要带我去波浪线。 什么是我们认为CD点点 是要带我去吗? 它会带我到/ home。 因此,通过打印工作目录波浪线, 我在现在的/ home / jharvard。 从一个目录时, 现在,这里说的/ home。 现在CD点点。 现在我在根目录下, 你不能再这样做。 你会仅仅停留在 根目录下去。 根目录下有一大堆 ,如果你想看看的东西, 您可以。 例如,如果我去 成箱,包含 所有这些二进制文件,如ls, 和CD,以及所有这些事情。 因此,这些命令需要 存在于系统中的某个地方, 它是在/ bin目录下。 但是你做的几乎一切 将是从你的主目录。 和CD对此不承担任何参数, 你可以说CD〜,不需要。 CD将会给你带来 回到你的home目录。 其中最后一个。 CD - 将会给你带来回 你是在最后一个目录。 所以,我只是cd'd连续两次,所以我 最后的目录是主目录。 如果我去削减斌,现在 让我们上去,进入用户。 用户份额。 让我们去的用户份额。 现在,我现在在用户份额。 CD - 早在箱中。 所以这变得特别有用 当你have--,它会切换。 所以用户份额,回仓,仓份额。 所以这变得非常有用。 你会发现自己有很多, 很多很多嵌套的目录。 而你想要做的事 真正的快速的上一级目录。 你去到该目录,使 变化之类的东西, 现在你想要去 回到你在哪里。 CD - 。 我总是很沮丧 当我正好去 该目录我 想干的工作英寸 我总是感到沮丧时,我做了 这两个步骤,而不是一个步骤, 因为这意味着CD - 是怎么回事 带入的中间位置 而不是在这里我想去的地方。 所以我们看到所有的列表文件。 我们知道如何解决为止。 所以,现在让我们来谈谈编辑文件。 所以在这个过程中,你几乎 总是希望用gedit。 如果你愿意,你可以采取的下一个步骤 并开始学习命令行的文本 编辑器。 因此,不同的选项存在。 和那些可能 将与您, 我们有纳米时,Vim,和Emacs。 因此,Nano是初学者 命令行的文本编辑器。 因此,纳米,让我们去 blah.c我刚才创建的。 这只是这个标准的C文件。 你看到一大堆的东西 在屏幕底部的继续, 显然blah.c 这包含C代码。 所以在这个特定的编辑器, 它是说在bottom-- 现在这个插入符号的象征, 我们看到的这款^ G,^ X,^ o。 因此,在几乎所有 的背景下,你看, 你可能会看到插入符号符号 其他地方上网,对堆栈溢出, 类似的东西。 它几乎总是指控制。 因此,要退出我想做的事情 十,控制控制X,退出。 我可以用我的箭 键移动。 请注意,我不能指向和点击爽快。 你需要用你的箭头 键移动。 有可能是一个设置 指向和点击。 但是让我们做出一些改变。 现在控制X去退出。 它会说保存修改过的缓冲区。 现在的提示,Y(是),N(否)。 控制下取消。 我只想说是的。 文件名来写。 默认的是文件 它已经是了。 按Enter键。 行。 现在,我刚刚编辑的文件, 保存它,并且它被改变。 所以纳米是最简单的 文本编辑器就习惯了。 在替代品的Vim和​​Emacs。 这些都是更高层次的文本编辑器 有一个非常陡峭的学习曲线。 所以我个人的偏好是Vim的。 并且它有各种各样的选择。 一旦你习惯 它,你将永远不会 想要去的任何其他 文本编辑器,因为你只是 有这么多的事情 在这些提供给你, 但它需要一个真正的 很长一段时间来学习。 因此,也许你只是想逼 自己现在要习惯它, 但我要说这是值得的。 但做起来很难。 然后Emacs的。 我一直在Emacs中挣扎,因为 我知道该怎么做绝对没有。 显然Emacs是默认情况下不 安装在设备上。 我们可能会补充说, 作为默认安装的。 一旦你学会了一 VIM或Emacs,有 没有令人信服的理由 不断学习,另外, 但它是一个完全不同的风格。 OK,这样的编辑文本文件。 听众:如果你被卡 在Vim的现在,怎么办we-- 罗布·鲍登:有 多种模式的Vim中, 并且有全 教程学习Vim的。 如果你恰巧是这样 在以插入模式 输入文本,你可以 输入以各种方式 但我是你如何进入插入模式。 或摆脱任何特殊的 模式你在,只是逃命。 而你只是来砸逃生得到 出任何嵌套模式的研究。 刚刚好,现在我又回到正常模式。 因此在正常模式中,一个冒号。 你看它出现在底部。 然后Q。 所以Q将退出,如果你已经进行了更改, 而我 - 因为我已改变? 我显然所做的更改。 所以,如果你已经进行了更改,它会 说你可以把一个感叹号。 我要叫它一声。 所以,你可以把一个班只 退出而不做任何事情, 或结肠WQ将保存并退出。 因此,瓦特一般是写。 所以写的文件。 我可以写,然后退出。 或者你可能只是 QX满贯,Q爆炸刚 要离开那里,无论 那你所做的任何更改。 好吧,那么现在让我们来 go--我们可以创建文件。 让我们开始删除文件。 我就随便扔在一个 很快新的命令,触摸。 因此,触摸FOO。 触摸吧。 触摸巴兹。 如果我LS,现在我们看到的 这些文件的存在。 他们完全是空的。 因此,触摸仅仅是一个简单的 1的方​​法,[听不清]。 二,技术上只是状态 它,它更新的时间戳。 所以,你所创建的任何文件都有 与之相关联的时间戳。 所以巴兹上创建 9月14日的16:21。 它现在是16点22分,所以,如果 我再碰巴兹我们 看到巴兹最 最近修改的16:22。 但除此之外,我几乎从来没有 看着文件上的时间戳。 所以触摸,在这里我只是用 它创建一些快速的文件。 好了,所以现在RM是 命令,我们关心这里。 我们可以RM嘘声。 说定期删除空文件嘘。 我们可以键入y,而现在它的排除。 RM巴兹。 定期删除空文件 巴兹和类型N(否)。 现在它不会被删除。 所以,酒吧和巴兹依然存在。 富走了。 GABRIEL继续说。 罗布·鲍登:太好了。 因此,恼人的消息 在这里,除去常规empty-- 你在做什么在哪儿? 定期删除空文件。 因此,如果我们不想成为 受该消息困扰, 我们可以在这个-f扔 标志,并所以这是力。 而现在,如果我RM -f,它不会 说你想删除此文件。 它会就去做。 和LS,我看不到了吧那里。 现在这是一个潜在的 危险的命令。 它往往不会太糟糕。 我们会回来的第二个怎么样 它可以变得非常危险。 让我们创建一些临时目录。 MKDIR,其它命令。 所以MKDIR是一个命令 这使得一个目录。 而现在通过LS,我们看到这个漂亮的光 蓝色突出显示临时目录。 我可以用cd命令进入温度。 我可以命令mkdir foo中。 cd到foo中。 MKDIR吧。 cd进入酒吧。 所以我们看到,我们可以很容易地得到 进了一些漂亮的深层嵌套。 现在我怎么删除一个目录? 命令rmdir。 所以,如果我只是直接尝试RM, 像我们做一个常规文件, RM杆将要 说不能删除吧。 它是一个目录。 有一个特殊的命令 除去种目录。 于是命令rmdir吧。 现在酒吧已经一去不复返了。 好了,命令rmdir我几乎从来不使用。 究其原因,现在being--我们 做一个常规文件的酒吧在这里了。 于是命令rmdir嘘。 命令rmdir。 无法删除foo中。 目录不是空的。 所以,你不能使用在目录中删除 目录下有东西在里面。 所以,你有一些选择。 你可以进入该目录,删除 一切手动,然后走出来 和rmdir目录。 这显然​​听起来很烦人。 如果有成千上万 在里面的文件? 嗯,你可以RM *。 我们将在第二讲*。 这基本上意味着所有的事情。 但更重要的是,这样RM -r。 所以,RM -r--了很多 背景,-r表示递归, 我们将谈论什么 递归装置在几个星期。 但它基本上意味着导线 这个目录的全部 并取出了一切。 所以,RM -r富会说 陷入目录富? 是的。 定期删除空文件foo /酒吧? 是的。 删除目录FOO? 是的。 所以,现在foo和一切 在它已被删除。 现在,可以得到特别烦 when--让我们碰1,2摸,摸3。 可能有一大堆的文件。 如果我想,我可以创建 成千上万的文件在这里了。 和RM -r FOO是怎么回事 是相当恼人的。 是的,是的,是的,是的,是的,是的。 有很多文件,你 赶紧看看有多少次 我会是类型。 好了,我们只是看到了之前我们怎样才能 摆脱无需输入yes,-f的。 所以MKDIR富CD富触摸1 2 3。 好了,命令rm -rf foo的是要 盲目地完全删除foo中。 没有任何提示。 什么都没有。 富走了。 所以我倾向于使用这种 命令所有的时间。 这就是说,它是一个 很危险的命令, 因为如果我做这样的事 这一点,就不会提示你。 它将会消失。 和它发生相当频繁, 甚至在更高级别的CS课程。 有时我们会看到 一些地方的人 说我不小心我们的RM RF-ED我的家 目录和我所有的P组已经一去不复返了。 而且它是毁灭性的, 但没有垃圾桶。 有没有有什么 供您检索。 这只是走了。 更糟糕的是 像RM -rf /。 所以我们刚才讨论 该根目录中。 它拥有所有的 您的系统上的文件。 事情往往会变得相当凌乱 当您删除之类的东西LS, 和CD,以及所有那些。 听众:有什么区别 RM,RF和rm *之间 罗布·鲍登:所以RM * - 艾里逊:问题是有什么 RM,RF和rm *之间的差异。 罗布·鲍登:所以RM *。 明星一般是所有的 此目录的内容。 冥思苦想其他的 方式呈现明星。 好吧,其实明星一般 指符合任何图案。 所以,如果我有一个名为DOG1的文件, 触摸DOG2,触摸CAT1,CAT2触摸。 所以LS * 1将打印和CAT1 DOG1,因为明星可以填充 在with--一个需要存在, 但明星可以是猫或狗。 这是一个外卡。 这就是我正在寻找的话。 外卡。 或者我可以ls的狗*和 我还见到DOG1,DOG2。 所以,那些上市文件 匹配特定的模式。 您可以以这种方式使用ls命令。 LS * STAR匹配任何内容。 因此,它会打印所有的 此目录的内容 因为所有的人都一致。 它不会打印出任何东西 在上一级目录。 如果我有一个子目录,foo和 摸1 2 3--所以现在如果RM *星, 删除CAT1,CAT2,DOG1,DOG2。 无法删除foo中。 它是一个目录。 所以明星扩展到所有的 目录中的文件。 所以在技术上RM *好像是说 RM CAT1,CAT2,DOG1,DOG2,FOO。 而RM -rf,技术上明星会 实现我们想要的东西,但RM -rf-- 如果我走出这个 目录,RM -rf温度, 那将进入温度和 递归删除一切。 所以,明星是分开在那 了解by--所以这件事 我正在运行,这个东西 这是促使我要命令 然后执行和操作的 他们,我称之为我的壳。 所以这个shell本身就是一个程序。 如果我想,我 可以运行位于/ bin / bash的。 壳被称为庆典。 现在我们看到的东西 已经略有改变, 那是因为我的设置 外壳有所不同。 但现在我在技术上运行 在我原来的壳壳, 我可以退出该shell,现在 我回到我的顶级壳。 说法的目的 这is--的明星。 所以,明星是什么 理解的是bash。 于是命令rm -rf,-rf标志 理解只是RM。 它知道,当你 通过一个-rf你 希望它递归删除 所有的文件而不提示。 明星被理解的东西 通过bash中,当你说RM *, bash中是不会说 哎RM *,取出明星。 击会说RM * 删除CAT1,CAT2,DOG1,DOG2。 它会自动将扩大 所有在该目录中的文件。 同样波浪线是另一个 符号bash的理解。 当你说CD〜,bash的扩展 那到你的home目录。 其他问题这么远吗? OK,所以我们要开始去快。 选项​​卡中完成。 只是把它扔到那里。 很多人不 意识到这一点的存在。 所以,如果我输入的CD陶氏,我 要进入下载。 我并不需要键入nloads。 我可以打标签。 所以它识别出 陶氏是一家前缀 不符合任何东西 否则在此目录中, 所以它会完成你们。 现在我可以进入。 我也做了递归。 于是命令mkdir foo中。 让我们去到foo中。 MKDIR吧。 所以,要回我的家 目录中,我可以看到下载。 现在再次打标签, 自动将填foo中。 这是唯一的目录。 再次击中标签,自动 去填写吧。 所以,现在我在(〜下载/富/条)。 所以这个选项卡中完成, 每当我到办公时间, 而我站在 一个人的肩膀, 他们要去RM D-O型W-N-L-O-A-D-S,我要死了。 只是标签,标签,标签,标签。 所以肯定使用的标签。 同样和 下来,很多人 只是碰巧 从来没有触及上下。 它会经过以前 命令,所以如果你只是跑的东西, 并且要再次运行它, 牵住了,直到你得到它。 行。 这么快,一些其他的事情。 让我们重新回到温。 让我们创建一些文件。 所以在这里,我只是 要列出一些单词。 狗,猫,喵喵。 让我们做狗,鱼。 所以,现在代表是一个非常 有用的命令,你 使用全搜索 对于一个特定的文本文件, 而在技术上,你可以做真正的 复杂的表达式为它匹配。 所以在这里,如果我用grep,什么 我要搜索? 比方说,我在寻找猫和 我要搜索所有这些文件。 所以,我该怎么做所有这些文件? 星。 因此,在文件中的一个,我有一只猫。 我大概可以有 称它更好的东西, 因为看起来像 行号什么的。 但在文件中的一个我与猫的线。 在文件中的两个我有猫行。 所以,现在我可以看看里面的文件之一, 看噢,该文件确实有猫。 通知文件中的三个不匹配 因为猫是不是在那里。 我可以grep的喵。 只有文件中的两个有喵。 因此,这可以结合, 再次,与-r,这 正如我以前说过 通常意味着递归。 所以,我可以在这里拿出中,grep -r 任何情况下of--让我们编辑 这一次只是扔一只猫在那里。 所以,用grep -r任何情况下 猫的整个目录。 它会递归 搜索所有子目录。 因此,在巴兹,还有猫。 在温度/ 2,还有猫。 而在温度/ 1有猫。 所以这是文件中进行搜索。 现在,你也可以使用一个发现。 等发现是专门约 寻找具有给定名称的文件。 因此,让我们做更多一些。 让我们进入下载。 触摸DOG1。 触摸CAT2。 触摸cat_dog。 触摸catcat。 所以我想找到的所有 文件与狗的名称。 因此发现,与最长 一次,我从来不记得 如何找到工作,直到我终于 读的东西,说得那么清楚。 所以发现,自动递归。 你并不需要通过一个-r。 所以找点。 我们还没有谈到点呢。 而点点总是 是指一个目录了。 点总是表示当前目录。 所以我可以RM在-r点 同样的方式,我可以命令rm -rf *。 最终他们 完成同样的事情。 RM -rf点是要去除 整个当前目录。 好了,我不想在那里做。 但找到点。 所以递归搜索当前 目录,现在一切 在此之后的一堆标志,你 使用从返回排除的东西。 所以找点返回的一切,它 可以找到从当前目录。 这些都是所有文件 递归搜索。 我们将看到一些有第二个的。 但如果你想知道我该怎么办 即,这样的命令K,最起码 我在Mac终端将其清除。 控制l通常清除 这对于任何类型的终端。 您也可以键入清楚。 如果你有机会 成一个奇怪的scenario-- 它发生在我身上了几个时间 - 在您提示的颜色 都搞砸了,或者你 不能够看到什么 当你正在打字输入,因为 有时像背景颜色设置 相同的前景色 现在你看不到的字体。 重置是什么,只是重置 你到默认黑色背景, 白前,或任何 你将它们设置为。 所以,我们说到哪儿了? 找点。 所以,现在一切都过去,这 点限制的结果 东西相匹配 给定的模式。 所以在这里我要搜索 一切与名猫。 我什么也没得到。 为什么会这样? 好吧,我只是在寻找 东西正是名猫。 如果我想搜索的东西 有一些图案,并cat-- 引号技术上是没有必要的, 但我扔在那里。 所以,现在它找到catcat因为 这是唯一的事情, 有一些武断 其次是猫的图案。 我可以把猫*,现在 找到catcat,cat_dog,CAT2, 因为那些都是事情的猫 在开始之后任何东西。 你可以结合这一点。 如果你想搜索所有的C文件 你有,你可能会做的* .c。 我们在这里blah.c。 所以这是一个发现的作品。 您可以搜索。 它有一大堆的标志 为进一步的限制。 和一个对他们来说,假设-d。 所以不推荐使用。 哦,那不是我想要的。 不-d。 D型。 因此,发现点 - D型。 还等什么,仅仅是做了我搜索 在当前目录下的所有文件 与A-- d代表 directory--目录类型。 这将返回所有目录 在当前目录中。 和F型的所有常规 文件,所有的非目录。 所以,这只是一个 例如其他的方法你 可以限制搜索其它 比文件的只是名称。 它已经30分钟。 仍在继续。 艾里逊:我会微风过。 它会没事的。 罗布·鲍登:所以一些其他的事情。 现在的一声,感叹号。 这样一般是指: 好了,让我们看一个例子。 所以!楼什么的怎么办? 那么它似乎有 反复找点型F。 怎么样!克? 这只是用grep -r猫*。 所以,一鼓作气,您可以使用重复 最近完成的命令。 所以,如果我输入!GRE,它会重新运行 始于GRE大多数命令 最近。 你可以看到这一切 历史命令。 所以历史。 这些都是 命令我今天跑。 和好了,这是不是真的 限于今天, 但我只用这 家电今天的。 这是你的全部 你的bash shell的历史, 除了它在某点切断。 听众:如果你这样做,会发生什么 历史[听不清]命令和错误 在结果仍然打印the-- 罗布·鲍登:是的,如果有 在这些commands--的一个错误 所以我们说,这是一个 未找到错误的命令。 仍然出现在历史记录。 行。 在什么其他问题? 所以这就是一声巨响。 现在,真正有用的命令,伙计。 所以,让你的 手动对给定命令。 所以我们说男人的ls,所以 这是我展示LS。 它列出目录内容。 这是我看到有 都存在这些不同的标志。 所以我们看到ls -l命令的存在 如果我们阅读。 ls -l命令 给我的这个完整列表 与谁拥有的文件目录, 该文件的大小,在 的修改的时戳。 所以LS -a是另一个你可能会 实际使用多少有些频繁。 -al是我最常见的标志,在过去的LS。 所以-a,看到有很多 不仅仅是LS多个文件。 LS -a。 什么是在与所有这些文件? 他们先从一个点。 所以这是一个约定在Linux中的 即以点开始的文件是隐藏的。 所以它只是意味着, 当我们刚刚直LS, 或者,我们正在寻找使用这个目录 取景器相当,或Windows 资源管理器等同,我们 不希望看到这些点文件。 他们只是污染对事物的看法。 因此,他们被隐藏 除非您特别 要求他们像-a。 这样我就可以用cd命令进入。本地,我看 这本身就是一个目录 一个共享目录, 应用程序,等等等等。 于是点,他们只是隐藏文件。 好了,其他重要的。 我有一对夫妇,我可以跳过。 让我们只对真正的快速通话 文件重定向的东西。 所以这是一个复杂的全系列 的东西,你可以用这些做什么, 只是看到他们,让我们说,回声。 另一个命令。 非常愚蠢的命令。 它所做的就是打印我告诉它。 所以回声招呼。 它只是回应打招呼的画面。 你好世界。 相呼应的hello world。 因此,一个命令或者一个 符号bash的理解 比符号这更大,并 即,输出到文件符号。 所以,如果我输出这 FOO,现在有一个文件 名为foo,里面 这是世界您好。 所以请注意,当我回音 你好世界管到foo中, 它没有回音的hello world。 相反,它被放入文件foo。 而另一个命令只是 把它扔在你的猫。 这是一个简单的方法来一场彻底 列出的文件中的内容 这样我就不必开 文本编辑器来查看。 的所以内容 foo的文件是的hello world。 我可以猫blah.c, 内容是这样。 同样,这些命令是,不 希望你把它们都记住。 这个想法是,你见过他们。 也许你正在努力 什么,你 就像我讨厌打开此文件。 我希望我能看 在内容真正的快。 你可以这样做,那么 回过头来说,哦,我 记得是这样 存在,它的猫。 所以,是要的文件。 现在有没有什么好的 例如从一个文件中读取呢。 是什么东西把 从标准的东西? 任何简单的Linux命令? 当我们得到它,在一对夫妇 周所有piece--好, 这周你有一块,你 开始从用户接受输入。 所以通常你键入 该输入的键盘。 而不是打字说的 输入的键盘, 您可以改为管道从文件 所以,当你这样做的马里奥,./mario, 管中,从任何给定的文件中,并 那将运行马里奥程序。 在没有预料的输入 键盘上,而不是它的 只是要阅读 线路从FOO文件。 所以,大于富将其放入 foo的文件,且小于富 需要的东西,从foo的文件, 使用该输入到这个程序。 而刚刚看到它,我们也可以呼应 FOO酒吧巴兹,然后而不是一个 大于,让我们做两到foo中。 这是什么做的? 它只是追加到文件中。 因此,而不是发现,如果我不回应胡说成 富然后猫FOO,它只是胡说。 所以,当你输出到一个文件,它 完全覆盖该文件。 如果你只是想追加, 双[?平地机。 ?] 而在去年的管道。 管获取更加复杂,其中 它需要一个命令的输出 并将其馈送到下一个命令。 因此,一些平常的事情,历史。 所以,唉,我不想看这个。 告诉我在我的历史中的所有命令 在这里我用grep-ED的东西。 不,这是令人困惑的。 告诉我在哪里,我觉得所有的命令。 所有的查找命令我曾经跑了。 所以历史。 现在,历史输出到 筛选此命令列表, 但我不希望 将其输出到屏幕。 相反,我要管成grep的。 因此,让我们用grep进行查找的所有实例。 所以现在,而不是采取的grep 的输入,而不是of-- grep的是能够处理的input--我们 使用grep在这里稍微不同。 因此,而不是打字名单 事情我们想搜索 和所述的grep正在作为输入。 所以,如果我只是grep的发现,它 等待我输入的东西。 所以猫你好找到。 您好。 查找。 请注意,我每次键入找 它认识到,我输入的查找。 因此,而不是此, 搜索文件的查找。 所以,历史是现在要 输出所有的命令的列表。 我们把该输出, 我们正在喂养它到grep, 所以它吐出 发现的所有实例。 我之所以说这会很混乱 是,如果我 - 它仍然扑朔迷离。 如果我用grep grep的。 请注意,这是几乎总是 显示命令我 跑,因为该命令 本身具有的grep它里面。 好了,就什么问题吗? 我会在这一点上转移过来。 希望这是一个很好的 所有命令的概观 你不需要有 记住,但是这些补 坚实的95%是我 这样做在命令行中。 也请记住,在命令行 本身的bash是一种编程语言, 所以,当你坐下来,你 可能需要做非常复杂的事情。 因此它具有类似的东西 循环,并且如果,并且所有这些 那你要习惯 与你的编程语言。 但是,这是超越 本节的范围。 好了,没有什么问题? 艾里逊:没有? GABRIEL:你会to-- 艾里逊:我能行 对矿井,如果你想要的。 我们可以看看会发生什么。 罗布·鲍登:关艾里逊。 艾里逊:呜。 你是一个望尘莫及,罗布。 难道你要我跟你转? 或者你有,OK。 我要去尝试,并没有 很是冗长那里。 如果让这种意志来看看 工作,我想它的方式。 也许? 哈哈! 是的。 所以,我只是要很快去 通过变量,循环,条件, 和编译器一点点。 如果你有问题 任何时候,请阻止我。 这些家伙会提醒我重复 你的问题的情况下,我忘了, 但应该不会太差。 所以变量,是的。 我们有没有一个你 片划伤这里。 我敢肯定,你们中的大多数,如果 你有某种游戏 那你从头开始创建,你有 保留的东西轨道一样得分, 或时间,或类似的东西。 因此,那些明亮的橙色 我们看到有件 都只是暂存形式 变量,你一定会 可以使用变量 整个程序。 如果你不是,我不是真的 知道自己在做什么。 但无论如何,大的事情, 定义变量。 用C每一个变量都有 有一个类型中声明, 所以我给你一个非常 一般一个在顶部。 所以,你有你 类型,然后什么 你决定打电话给你的变量。 所以在这种情况下,类型 在变量列表。 我们有三个例子。 夏亚有些档次的, 一个A,这是什么 我敢肯定,你都想要 取得这一类。 您可以定义多个 在一行中的变量 只要它们具有相同的类型, 这是我们的第二个例子中有 在这里你有三个 变量中,x,y和z。 他们都是浮动。 然后你也可以,在这最后 例如与诠释得分和数量 队,你可以 初始化它们就在那里。 所以在中间例子,其中我们 只是有X,Y和Z的浮动, 那些尚未初始化。 他们没有任何价值。 或者他们有垃圾值。 如果您尝试使用它们, 编译器会骂你。 你有两种申报和 初始化变量。 因此,在这个最后一个,我们正在做两个。 我们声明变量 比分和球队的数量, 我们正在初始化他们,给 7和4它们的初始值 分别。 凉爽。 大家好? 真棒。 OK,所以一些约定。 如果你们看过 通过样式50,这些 只是事情,我们想为 你要实现你的风格。 因此,有意义的名称。 如果你开始打电话的事 刚的x,y和z,尤其 当你进入更长 程序,你 可能会 迷惑自己,是 喜欢什么是这个变量指。 我不知道这意味着什么。 所以,如果它意味着持有 分的高分,称其为得分。 如果它的目的是保存一些答案 或导致,给它一个这样的名字。 for循环,我们将 进入的下一个幻灯片, 单个字母的变量都是精品。 ROB BOWDEN:我,j和k分别 只是约定for循环 每个人都希望他们 被称为I,j和k。 您可以拨打them--我看行 列或行的电话,有时 对于两个嵌套循环,并 这也是一种标准。 但是,i和j被完全理解。 ALLISON:是啊,我和 j您是完全的罚款。 为了清楚起见,像 在你的一些P组, 它可能是有意义有更多的 在那里只是描述性事 跟踪它。 但我认为,I,J和K,我认为 绝大多数的我们全部使用。 罗布·鲍登:有了这些 约定,所以风格是很重要的。 这是四个轴中的一个 在这你分级, 它是那么容易只是去了 你P设定在年底确保 有没有文体的错误。 所以一定要确保你是正确的tab键切换。 确保你的变量命名。 留下一些评论。 这是很容易得到这些点。 你不必去想 为了任何事情来得到这些点。 你不必弄清楚什么了。 它只是使它看起来很漂亮。 艾里逊:其实我们 有风格的50,这 会告诉你,你搞乱 了,如果你搞乱款式 并会告诉你,正是你 需要修复,你需要如何解决它。 这也是刚刚好提 这是当然的政策 如果你在办公室 小时,你的代码是一个烂摊子, 我们可以拒绝帮助 你,直到它看起来更好。 于是开始了吧, 保持一贯的风格, 你也只会让 你的生活轻松许多,当 你试图去通过调试。 如果你想弄清楚 在那里你错过了一个大括号 他们是所有的地方,你 只是让自己的生活更加艰难。 所以,要与风格相一致。 我保证它会让你的生活更轻松。 它会让我们的生活更轻松。 每个人都会更幸福。 这就是你想要的。 GABRIEL:你的分数会更高。 ALLISON:是的,你的成绩。 如果你的TF就是喜欢你, 往往是有利的。 好吧,然后就 这里的第二点。 一致的初始化。 所以,正如我们所看到,你可以声明 和初始化的东西。 在同一行上的多个变量。 我们希望您不是一回事 做的是声明一些变量 而不是初始化它们在同 您正在初始化其他线路。 所以,如果说做 没有任何意义, 我们这里的例子 我们正在申报整数 在宿舍的变量 助攻和便士, 但宿舍和便士 有没有初始值。 我们没有初始化他们, 但就在中间有 我们已经初始化助攻为0。 所以,无论是做宿舍,硬币,硬币。 或者做宿舍等于0。 一角硬币等于0。 便士等于0,或任何 这些初始值。 大的事情有型有款,是一致的。 如果有疑问,是一致的。 但是,按照我们的风格指南了。 凉爽。 每个人都很好吗? 听众:哪里的风格指南? 艾里逊:本风格指南 是on--有什么网站? GABRIEL:我认为这是manual.cs50.net/-- 艾里逊:风格? GABRIEL:风格。 是的。 艾里逊:是的。 那么问题究竟在哪里风格50。 manual.cs50.net/style。 是吗? 听众:如果我们定义 变量,它是OK 如果我们把像[听不清]像 INT得分,然后INT目标。 所以,你会说,现在我们已经 一定要确定他们在一起吗? 艾里逊:那么质疑,应 你有多余的代码 当你定义 变量如int得分和 在下一行INT游戏? 罗布·鲍登:有一定 情况下,冗余的代码是坏的。 我不会考虑 该冗余代码。 我几乎从来没有申报多 变量在同一行过。 如果有什么,那是因为 平时我留下一些评论 解释变量是什么。 所以我会说INT得分斜线斜线。 跟踪什么的。 在总斜线斜线。 因此,它是那样的多格罗瑟 把它们都在同一行上。 我从来没有把它们放在同一行。 艾里逊:我觉得这是 个人偏好在这一点上。 听众:这是否去 for循环之类的东西吗? 罗布·鲍登:像里面? 如int i等于0逗号 长度等于什么? 那你没有选择。 用for循环的初始化 part--所以你可能只看到 INT i等于0分号我少 比任何分号我加再加。 这个int i等于0, 技术上你也可以 做我们之前看到的 用逗号语法。 INT i等于0逗号Ĵ 等于3逗号k等于5。 你没有选择拆分 这为多行, 这就是标准。 看到它有罚款。 艾里逊:真棒。 好吧,方便SEGUE成环。 所以呀,我们这里有一些例子 回路,你们在看到划痕。 当然,所有的这些 只需在C.重建 他们基本上是让你 重复代码的某些部分 直到一定的条件 得到满足,我们将 进入正确的说话后, 关于循环使用条件语句。 因此,我们有三种主要类型。 因为,虽然,做一段时间,这 我们将所有的经历现在。 所以,第一个是for循环。 所以对于一些条件, 执行这个代码块。 我们有这个很酷的小 关系图在此间举行的底部。 但基本上,你在 你的,那行头, 你要 初始化变量。 因此,当我们谈到,我是 等于0或i等于10。 无论你需要的 变量是它的 要被初始化的存在, 声明和初始化为某个值。 所以后来我们有一些 条件是怎么回事 要检查我们的 可变反对的东西。 这样的情况下的典型的情况下 也许你想这部分代码 执行五次。 因此,我们不得不INT i等于0,而且我们 希望它是,当i小于5。 使条件是刚刚 要检查每一次。 如果条件 计算结果为true,它的 要运行的代码,而这正是 这是什么小图是显示。 所以它执行它。 它更新一个变量, 这就是我们看到的 在我们对的最后部分 环路初始化那里。 因此,只要继续这样做 直到该条件没有被满足, 然后将退出 循环并继续 移动与程序的其余部分。 每个人都很好吗? 凉爽。 因此,这里是一个例子,非常相似 到东西,我刚才讲的。 所以,我们只想打印 这是CS50 10倍。 所以,你在这里看到我们有 我们的,然后我们 初始化变量 i到等于0。 我们的条件检查 它的不到10%。 因此,计算结果为true时首先我们 开始,然后更新我们的变量 每次它实际上执行的时间 并打印出来,这是CS50。 经过10次将终止。 凉爽。 所以,当环路旁边。 正如你看到这里,我们只是有 有的虽然这condition--问题? 观众:我怎么能跳 其实不只是一个数字, 但两个号码[听不清] 我加再加加? 艾里逊:所以,问题是你怎么能 由一个以上的更新变量 的时间。 所以我加Plus会 更新一个各一次。 如果您希望通过更新它 2,你可以做我加等于2。 罗布·鲍登:你见过 加上演讲等于没? 听众:[听不清]。 艾里逊:这是有效的 同样的事情,我等于我加2。 因此,它打算把它和 通过每次2更新它。 加等于只是一些 我们所说的语法糖。 罗布·鲍登:是啊,那些存在 几乎所有的算术运算符。 所以,我多次等于 将增加一倍的数量。 Ĵ除法等于3是相同的 作为j为j通过3分。 艾里逊:或减等于2将 通过每次2递减岛 罗布·鲍登:即使MOD平等。 你没见过位运算符, 但插入符等于和等于符号, 所有这些的存在。 艾里逊:所以很多时候,尤其是 你的第一对夫妇的P组, 你将很可能由递增 一个,所以我加再加,J加再加 是你要的所有东西 以典型地使用。 但该更新条件是 完全的控制范围之内。 您可以通过任何增量更新 或以任何方式你决定。 也许你甚至希望它是 随机数的时候。 但是,是的,有很多 事情可以做的。 你不会受限于我加再加。 罗布·鲍登:只要你 知道它的存在,它也 存在的另一种形式,再加上加上我。 因此,如果你曾经在网上搜索 而碰巧看到再加上加我, 几乎是同一个意思。 艾里逊:酷。 好不好? 真棒。 因此,尽管循环。 非常相似。 你有一些条件。 最主要的是要注意 这里,代替具有 三个不同的部分 成立,我们有一个。 我们只是有一些条件 这就是被选中。 并以同样的方式,只要 该条件的计算结果为true, 你的代码将运行。 如果它是假的,它 将终止,招 到你的程序的下一个部分。 因此,这是种like--什么 检查的一个很好的例子 对于一些正常状态? GABRIEL:尽管这是事实。 艾里逊:你可以这样做,而真实的。 井,1等于1。 罗布·鲍登:你可以做while-- 使用for循环刚相反, 你总是可以编写一个 for循环在while循环, 所以我大于0或 虽然我不到10。 艾里逊:真棒。 然后我们做的while循环,这 非常适合用户的验证,其中 你想获得的东西 你的用户,看它是否有效, 然后从那里继续。 所以的事情知道的一个是用 这样做,而在于它要执行, 然后它会重新执行 如果满足这一条件。 所以,可能是最好的方式做到这一点 只是看到一个例子来说明。 因此,正如我刚才提到的,用户 验证是真的useful-- 或者做消遣是真的 实用与用户的验证。 因此,这只是走 重新提示一些用户 直到他们进入一个正数, 这可能是你的P组有用 本星期。 因此在这种情况下,当我们 首先运行该程序, 它要打印 输入一个正数。 它会得到一些 来自用户的输入, 然后它会检查 即对输入的条件 你已经为它设置的。 所以在这种情况下,它会检查。 它会说,OK, 是我们的输入负数, 或者是0或负, 这将是无效的。 这样的话它会重新提示。 问题? 听众:这是相同的,那么作为一个 while循环,如果你只是复制代码 并把它[听不清] while循环? 艾里逊:那么问题是会 这是相同的只是一会儿 循环,如果我们只 复制while循环以上。 所以在这种情况下,你的while循环 要首先检查条件。 所以在这种情况下,如果我们试图 写的只是一个while循环, 它会说而 输入小于1。 但是,我们并没有一个输入它。 听众:如果[听不清] while循环包括这段代码, 但你应付代码 上面的while循环也。 你只要有这个代码 [听不清] while循环。 ALLISON:这将是 同样的事情,是的。 所以,你可以只写 - 而不是有一个do--肯定的。 GABRIEL:但是,这更优雅。 ALLISON:是啊,那是更优雅。 你可以进入设计和诸如此类的东西, 但是,是的,你完全可以做到这一点。 还有没有其他问题? OK,爽。 因此,我们谈了很多关于条件 所有这些循环,我们有, 所以我们实际上进入 条件布尔表达式。 同样,你在C中使用这些, 所以只是一种过渡 从以上图形界面 实际的编码。 酷,这么大一个,如果。 基本上只允许我们引入 一些逻辑到我们的程序和检查 SYS条件。 所以在这种情况下,确定, 为n大于0? 的确是这样,这样你就可以执行了。 这只是一些检查 你已经条件 设置,我认为我们都 舒适的检查环境。 凉爽。 所以,如果别人是你的另外一个, 你可以说好,如果这是真的, 这样做的第一件事。 否则我要你 默认情况下,做别的事情。 像这种情况,你要么选择一个 正数或负数。 你只有两个选择。 你需要它来执行,无论 了解你的用户输入。 所以,你可以说好, 是它大于0? 凉爽。 打印的正数。 如果不是的话,打印负。 大家好? 再有一点认识是 如果满足该条件的话, 的人会永远也执行。 只有将其中的一个 同时执行。 所以这是一个权衡。 你没有得到兼得。 你要么具备的首要条件。 你要么有,如果 还是一样,不能同时使用。 然后可以把事情 更加复杂, 因为如果你能做到, 否则,然后其他人。 所以在这种情况下,我们 有三个条件。 再次,只有其中的一个是 最终将会被执行。 所以,你可能想知道 好吧,如果你有什么 有什么事情, 能满足这两个。 也许无论你输入 符合这两个条件 因为如果和其他人的话。 唯一的事情,那将运行 艾里逊:一旦它发现的东西 它满足该条件 计算结果为true,这就是 它会跑,没有别的。 所以,如果你有这号 关于第1 0和5之间, 或者是介于3这个数 和5的其他部分如, 您输入的number-- 我说0和5还有 - 4。 这将创下第一个。 它会说OK,这 数为0和5之间。 执行和离开。 它永远不会打了第二个选项。 酷? 真棒。 OK,我们也有switch语句,如果 你想获得更为缓慢 - 还是遗憾, 开关旁边。 我自己走在前面这里。 同样,如果多块 正如我刚才所说的地方 只要你找到一个条件是 这是遇到了和其他人的话,如果其他人, 它的叶子。 如果您需要检查 多的东西,你 会想用这个,因为 它会检查这里的每一次。 因此,这将通过,如果运行 它是大于或等于90, 它会打印。 它将贯穿和 检查这些每一个人。 听众:所以这将是 比[听不清]更多的越野车。 这会不会像[听不清]? 艾里逊:问题是这是否 越野车还是该做你想做的。 这真的取决于什么 你想从你的程序。 听众:我的意思是,如果你把90等。 艾里逊:如果你把90-- 听众:[听不清]。 GABRIEL:你会得到两件事情。 艾里逊:你会得到两件事情。 是的,2。 罗布·鲍登:两个? 艾里逊:第 罗布·鲍登:四。 如果你把90,它会说你 得了A,你有一个B,你有一个C, 你有D. 听众:[听不清]。 艾里逊:对。 所以,我要看你 想从你的程序。 有时你需要 检查多东西。 你会得到更深入到什么 良好的设计是为你往前走。 重要的是要 知道的是,这 这里将检查所有四个条件。 然而,如果这是一个的if else的if else 否则的话,它会打的第一种情况下, 它会打印你有一个A和完成。 罗布·鲍登:即使我们 决定改变这是否 和大于或等于90, 如果和大于或等于80, 如果和小于或等于89, 如果n大于或等于70,则 并且n小于或等于 79,所以,这将是正确的。 这将做我们想要的,但 它仍然会检查每一个它。 因此,而在第一种情况,如果我们 进入90只,如果还有其他​​的话,如果, 我们输入90,然后 它要纠正。 它会检查第一 1,打印你得到一个A, 跳过一切,因为它 已经找到一个工作。 所有病例均是互斥的 否则的话,如果别人的话的基础上。 所以它会执行 首先,如果,那么它的完成。 它会走到最后。 而如果我们改变 这是什么我 说小于或等于89。 这将检查的第一个。 它会打印。 它会检查第二个。 它不会打印。 检查第三个。 无法进行打印。 检查第四个。 现在去打印。 所以在这种情况下,否则,如果 版本,因为这些情况 是相互排斥的,这是 更好地利用别人的话,如果还有的话, 因为那将不得不 少的条件检查 比这个版本。 艾里逊:真棒。 所以另一件事,我们可以 做的是switch语句。 基本上是一个switch语句 需要一些变量, 在这种情况下,它是n,并且 决定执行哪一个情况。 所以,这也是1在您的案件 应该是种相互排斥的。 所以在这种情况下,如果 我们得到一个,它的 要匹配什么的 n个变量 - 无论价值 是其中的一个箱子,所以1,2,或 3,并打印出相应的行。 然后,如果你在这里看到, 我们也有一个默认的, 你可以对所认为的你的人。 如果你选择的任何其他号码,以便 除1,2,和3在这种情况下 它只是要打印无效。 决定何时使用IFS与 如果偷别人对交换机是怎么回事 要的东西,你们会 看到你开始编写设计智慧 更复杂的方案,并且 有没有硬性的规定 的时候使用它们。 这真的取决于你的环境。 罗布·鲍登:而就 把它扔在那里 因为它是更舒适的部分。 开关时,往往会 be--所以你限制 在方式的数量,你 可以使用它们,因为如果, 条件可以很 你想要任何东西。 带开关的情况下, 必须是数字, 或技术上也可以是字符,但 字符,正如我们将看到的,都只是数字。 因此,他们必须是数字,但开关 真的,如果不是更有效 否则的话,如果还有,因为即使 以这个例子before--好, 档次例子似乎不错。 好吧,让我们在这里说,我们不是做 这是一个用if else的if else,如果场景。 因此,如果n等于等于1,则 打印你选择了一个低的数字。 如果别人当n等于等于2, 你选择了一个中等数目。 否则,如果等于等于3,高。 否则无效。 所以我们可以说,这是我们的场景。 所以我们可以说,我们进入 4,因此我们预计无效。 顺便说,如果其他的if else 如果方法是行不通的 检查第一个条件。 这不是满意。 所以,我们检查了第二个条件。 这不是满意。 检查第三个条件。 不满意。 所以,我们去别的并打印无效。 路开关厂 是它编译成 到了我们要去 调用跳转表。 主要的想法是 当你进入4的, 它可以立即去默认。 它并不需要检查时的情况下我吗? 没了,这不是它。 案例2? 没了。 案例3? 没了。 默认值。 OK,这一定是哪里 想要的,然后执行这一点。 不,它会立即跳转到默认值。 或者我输入2,它是 马上要去到2 而不需要去通过案例1。 因此,在这种方式 切实如今这 没有那么多的效率增益。 一般的电脑都还 快,这不是很大。 但它是这种情况即 开关速度更快。 如果你真的想 优化,使用一个开关。 艾里逊:酷。 然后我们有三元运算符。 所以我知道我前面提到的 单词语法糖。 所以,它只是事情让 你的代码更简洁。 因此,这是其中的案例之一。 因此,三元运算符是问号 结肠我们行字符串中看到 上的equalsñ大于100 问号高冒号低。 所以基本上这是如何工作是很 在n大于100是一个条件。 所以我认为这是有意义的。 这就像问一个问题。 它说的哦,是正大于100。 谁知道? 而如果计算结果为 如此,这将让你 第一件事是 那里列出,这是很高的。 否则,它会为您提供低。 所以,这只是一个非常简单的和 有效的方式做到像的if else。 这就是这一切。 如果我们写这 作为一个if else条件, 那将是如果n是大于 100余名,高回报。 否则,回报低。 这仅仅是一个更 写它的简洁方式。 罗布·鲍登:所以这个特定的例子 是当你正在做的事情 就是这样,这是一种模式 在这里我使用三元非常频繁。 所以,我们还没有谈到的范围呢, 但我讨厌看到字符串s分号。 如果n大于100,S等于高。 否则,S​​等于低。 这样的模式,这五个线 代码100字面上的时间% 可以被转移到什么 就是在那里与三元。 因此,三元,一行代码。 在别人的话,五。 这是一个例子,我点 每一次。 这将极大的地方 对于三元运算符。 它是那么干净。 但是,人们往往不会使用它。 艾里逊:把它拿走加布。 GABRIEL:所以现在你们所有的 在本周的演讲学会 这一切都在一个 计算机是二进制的,对不对? 就像这里的灯。 你可以是接通和关断。 和一切,我的意思是 从字面上一切。 一些数字和字符和字符串, 甚至代码,你写的时候 它被编译为机器 代码之类的东西, 所以这一切归结为0和1“。 所以,当我们正在处理 与整数,这 是什么,在技术上是非常 简单,我们应该能够做的东西 如添加它们,这是 最简单的事情大概1 你可以做两个整数,对吧? 因此,加法和减法工作得 就像它在十进制记数法, 在这里,除了它是二进制的,对不对? 因此,它在基地2。 所以加1加1。 这给了0和1进行了过来。 而只是一味地这样做,所以现在 自带的更有趣的问题。 我们知道如何代表所有 在计算机中的正整数, 但让我们做这个练习。 假装你们都在1960年或 一些试图建立一个电脑, 你必须拿出的 存储减去1的方法, 例如,或减去任何 整为此事。 你会怎么做呢? 任何想法? 就在我扔东西。 是吗? 听众:[听不清]指定 一个特殊的,如果你的[听不清]。 GABRIEL:您可以指定一个 特位,这将是0或1。 比方说一个,如果它是积极的 和0,如果是负面的。 该位,然后休息 只是存储号码。 凉爽。 所以这是一个非常好的主意。 我们有,我不知道,200。 如果第一位是 导通时,那么它的加200。 如果它关闭,这是零下200。 凉爽。 只有一个小 问题这一点, 这就是,如果我们试图总结的东西了。 所以,想象我们有11111在这里, 我们正在总结这与00100什么的。 如果这两个是积极的,这很好。 但是,如果一个 它们是负的,像 让我们说,这一点在这里 是一个负责任的 for--我打算做一个separate-- 所以这一个装置,该数字在这里 是正的。 这个意味着该 此数字为负数,对不对? 但是,当你 要总结他们,你 需要一个if语句 他说哦,如果这是0, 那么我的总和将是 不同的东西,对吧? 所以这是一个稍微 更聪明的方式做 即,这是所谓的二的补码。 所以基本上我们 做的是我们定义零下1 要的东西,如果 我们加起来1给了我们0。 让我再说一遍。 所以我们可以说,这是这里1。 是什么东西 当然在正整数 加入给我们0? 如果我们尝试将它添加到这个数字? 我们要have--好了,让我们添加。 我们将有1加1 为0,然后将其携带以上。 然后我们将再次得到0。 我越来越糊涂了。 而你会得到0和 0 0 0 0 0。 大量的0。 在最后的,我们不 要能够进行一遍, 因为假设我们只处理 用一个字节,所以只有8位。 所以电脑的默认操作是什么 只是忘记有关[听不清] 行? 因此,这就是所谓的 的二的补码。 我们简单地定义减去1是 这里的事情,如果你添加了1 会给你0。 这就是很酷 因为我们真的不 需要后期实施 不同类型的总和的 这取决于这是否是一个 负或正数。 这是否有道理? 这么一件事,我们做 这里为了将 积极和消极之间 整数,然后我们会抛一切, 然后我们加1的号码。 如果您尝试自己做 上一张纸, 你会看到这是有道理的。 但是,如果我把这个号码 这里,这是5。 所以,如果我翻转一切 这里,使1,1,1,1,1。 翻转,翻转,翻转。 然后我把它加1。 我要恰好有零下5。 行? 种这是有道理的,因为如果 你试图用数字总结本 我们面前,这 was--让我们再次拨动了。 这是101和大量的0。 如果您尝试添加这些 两个数字一起, 你将有完全相同0。 行。 有问题吗? 听众:[听不清] GABRIEL:你是什么意思? 听众:负向 正[听不清]。 GABRIEL:不,你翻车 你加1永远。 是啊。 好了,人物也被编码的二进制文件。 我们有ASCII表,你 也看到了讲座,对不对? 因此,它基本上是一个事物的映射。 在这里,我不能强调不够 对于一台计算机,一和65 从字面上同样的事情。 所以,如果我写的东西像炭ç 等于一,我可以在同一时间 只写65在这里,它 将是完全一样的,好不好? 有没有任何区别。 我们通常倾向于把 字符类型的变量。 CHAR,不是因为他们基本上是 对于制成的,但因为 人类的约定。 但是,你可以处理整数 而不是char类型的变量, 你会没事的。 唯一的实际差别 一个char c和一个int我之间 是一个int在大多数四个字节 系统,而一个字符具有一个字节。 他们本质上是 同样的事情在数据方面。 那么,什么将打印吗? 在这里,我们印刷用printf数字 用加1,只是喜欢整数, 字符可以总结,因此 的字符也可以被求和。 因此,这也正是65岁。 因此,有将是 66,在这里,我们有 65加小负大A, 这将是的,我真的不知道。 但是这将是完全相同的间隙 大写字母之间 和所用更小的文字,所以 我们将得到一个小,对吧? 是啊。 所以,这是怎么回事打印 性格这正是这一个。 好不好? 有问题吗? 在这里,我们有一堆不同 类型为数值型变量。 我们已经谈整型。 浮动,不过是to--这是真的 有趣,因为当我第一次听说 编程早在一天 Python中,第一个节目我这辈子 试着写,我看到有一个 在所谓的类型和类型称为浮动。 和浮子是对于所有实数。 于是我问为什么 我曾经用一个int呢? 因为如果我可以使用所有 实数有浮动, 我只想停止使用整数,对吧? 因为实数是 很像更通用。 事实证明,这是 没有电脑的情况下 因为他们根本 不同的东西。 所以,整数和浮点数时, 操作,你做给他们 是因为本质的不同 对它们的存储方式,好不好? 我们要谈一点 更多的关于在第二。 所以双只是一个更大的浮动。 通常在大多数系统中,一个float 是四个字节,就像一个int。 和双是八个字节。 很长很长,其实只是一个符号 你追加到如int类型。 你说的很长很长诠释这个样子。 龙长整型X使它更长的时间。 所以在大多数系统中,这将使 八个字节,而不是通常的4。 而实际上你可以删除 的,所以它只能说很长很长, 并且工作过,好不好? 你也可以做其他事情一样 unsigned int类型,或只是再次签名 也将正常工作。 而且,它们将使得X是一个变量 就像一切都是积极的, 所以你不能真正拥有负 在我们看到了这里的路上号码。 所以,下面的精彩 浮点和精度。 这是其中一个原因,为什么你 想用整数来代替花车, 因为整数是100%准确的,对不对? 这正是这个数字。 对于浮动点,如果你 说的答案等于1比10-- 我碰巧确切有这个 计划在这里,float.c。 打印到20位小数。 1除以10,并 通常为0.1,对不对? 但在这里,如果我们做 浮然后我们运行它, 我们看到,它不是完全0.1。 这是0.149的东西。 为什么会这样? 因为你不能真正代表每 在内存中一个可能的实数 因为有 不可数很多。 所以,我们在技术上只能 表示它们的一个有限数量 与数据的有限量。 但是,这真的很有趣。 现在,这引出了一个 的问题,你会怎么 去代表 与此位,对不对? 那么如何彩车存储? 与整数很容易。 但随着花车想要 最大限度的范围内, 并希望能够代表 巨大的数字和非常小的数字一样 0.000001同时。 如此反复,相同的游戏。 没有任何人有任何想法如何,我们可以 去代表内存浮动? 只是扔东西。 是的,请。 听众:[听不清]为 如果是两个整数和一个 作为[听不清]和一个幸福 小数点后的一切。 GABRIEL:好,冬暖夏凉。 所以两个不同的整数。 你可以有12.45,所以这是12和45。 不错。 什么前,先要考验你要说的话? 同样的事情? 是吗? 听众:[听不清]符号 你分开的基础在哪里。 GABRIEL:科学记数法, 是啊,这通常会发生什么。 因此,这就是所谓的尾数。 这就是什么是真正的 号,然后将指数 只是那里的逗号,不是吗? 因此,这将是东西 形式1,2,3,4,5次10 到零下4。 我只是意识到that--是啊,没错。 然后这个10的负4是 要定义所在的逗号,好不好? 在巴西,我们使用逗号。 在这里,你们用一个点。 这样一个点。 这是很酷的,因为这样你可以 集中大量的位上的这个家伙 这里,在尾数,然后这 将是您的实际精度。 你也可以做到这一点无论是在十进制 或在二进制基础的系统。 有不同 的方式来实现这一点。 有问题吗? 是吗? 听众:有多少地方 小数[听不清]呢? GABRIEL:这是一个复杂的问题, 因为它从来没有真正100%准确, 因为当你看到这里,为 一些数字是100%精确的。 我相信,如果我们把0.5在这里, 这将是100%准确的。 这将是0.500000。 所以在这种情况下,它是完美的。 但在其他情况下, 这是少得多完美。 根据我的经验,像多达四个, 小数点后五位是相当精确的。 如果您使用的是双,这将 有办法比这更精确,好不好? 罗布·鲍登:所以刚才扔 在彩车一些情况下, 我从来不记得100%如何 彩车的规格实际工作, 但我做你永远记得 漂浮开始变得凌乱。 这样的想法是,当你真的, 真正的大数字还是真的,真的 小的数字,我们开始 每况愈下 在差异化 之间的两个亲密的浮动。 所以,我怎么样想的是 浮点不精确, 有两个浮筒的 如果我尝试将它们指定 在C中,尽管事实是 他们是不同的数字, 他们将成为 解释为相同的号码, 因为我们不能将它们存储不同。 我们需要使用相同的比特。 所以,当我们到达 真的,真的大量涌现, 像10交谈的300 的东西,它是在该点 该10到300或 5次为10〜300个 无法区分 7次10到300。 所以这是一个相当大的差异 两个数字之间。 但是,当你趴下 到正常范围外, 你往往是相当 在区分好。 然后当你趴下真的很小, 你也变得非常糟糕了。 因此,像一大堆 0.0000,它变得非常糟糕。 GABRIEL:是啊,这么快注释。 从来没有做到这一点。 永远不要尝试比较 彩车使用equals等于, 因为即使他们几乎 同样,几乎相同的是不一样的。 那么,你通常做的是你减去 其中,采取的是绝对值, 看看这是不是小 0.0001或类似的东西,好不好? 和冷静。 我知道很多人都有 一些背景在Java中, 特别是那些谁做 AP计算机科学,对吧? 而Java是一种语言 这主要是基于C, 它有几个非常大的差异。 但对于循环,如果,之类的东西 ,他们都是一样的语法。 我有几个项目在这里展示这一点。 因此,举例来说,一个简单的Hello World。 这是世界您好在C中,你 家伙肯定是熟悉的, 而这一点,这个人是在Java中。 所以,在Java中,我们有这样的 公共类,你好世界, 公共静态无效 主,和字符串的args。 该字符串的args会 出现在C中很快。 但是,我们不要去那里呢。 现在,我们有空隙这里,这意味着 这主要是不带任何参数。 然后我们有 的System.out.println的,这就是 一种等价类printf的。 在这里,我们并不真正需要的反斜杠 N,因为打印LN这是否适合你。 其附加的反斜杠 处的N行的末端。 但是,如果你进入 有点像的,你 可以看到,他们是 几乎同样的事情。 这样的初始化,并且 条件,并且在更新 is--我错过了一个空间,这里 - 他们 几乎除了Java的同样的事情, 作为拥有几个高层次的东西。 在这里,我们可以做的,再加上我和 Java将自动 使这个我在这里,这是 一个整数,转换为字符串, 再追加 两个串在一起。 在这里,在C中,我们需要做的与%D。 这里的线,对于 长得一模一样。 如果我们看一下,如果,在IFS 还长得一模一样,对吧? 所以,真正的大差异 在你在这里看到的那些东西。 公共静态的,无效的,并 那么公共类的话。 因此,Java有什么 称为虚拟机。 这是非常严重依据是什么 被称为面向对象的程序设计, 这是一个非常,非常普遍 范式编程时下。 这个类的事情是你所看到的, 从面向对象的东西, 在你创建一个类,然后你 可以从派生类的对象。 我们不会说太多 不多,在CS50, 但是这绝对 东西真的很酷, 特别是如果你想进入 更复杂的Web开发 在该过程结束时, 像提交您的最终项目 和一些漂亮的框架和内容。 所以基本上的想法是,你 不想重新实现的东西, 所以你创造的东西,是 非常通用的,如形状, 然后创建 它从不同的形状, 然后从每个 这些形状,为您打造 在三个一些更具体的形状 尺寸或类似的东西。 他们有这样的层次,他们 从其他的继承,所以 所有功能和所有变量 大形在这里了,所有这些 将有,所有的这些都 将有,等等,等等。 所以这是基本的想法。 C没有说,但是C ++ 确实有这种功能。 和Java是严重影响 通过面向对象, 所以这就是为什么你看到 类在这里所有的时间。 而另一件事是 该Java虚拟机。 所以,我觉得,是一个非常聪明的想法。 那么是什么人谁 发明了Java的确实是 他们不想要 两次编译自己的代码 如果他们不得不在Windows中运行它, 或者Mac或Linux,所以他们做了什么 他们是从字面上运行 像家电, 但你真的不看到它发生。 因此,他们运行一个虚拟机 你的电脑,里面的这 基本上像一个 微型操作系统。 而且操作 系统的生命的目的 只是跑什么叫做字节码。 因此,而不是在C中,这样,我们将 编译这让若,然后运行 ./if。 我忘了反斜线。 在Java中,你会先做 Java的C到编译它,if.c. 这不是C.它的点的java。 然后,你必须运行不./。 你得到这个新的文件 if.class,但你不能真的 运行if.class现在只是 像我们以前那样。 这不是一个可执行文件。 您必须运行。 你必须把它送入 一个叫做Java程序, 并且该程序是虚拟机, 然后你做if.class,或者如果。 是的。 然后它的工作原理。 OK,所以这是同类产品中 虚拟机发生。 C没有了,所以如果我是 把这个程序在Windows机器上, 在Java中C.这是行不通的它。 有问题吗? 凉爽。 这是否超节今天。