你好, 欢迎回来｡
还是要讲一点控制流｡
所以, 让我们直接进入重复代码的循环｡
首先, 我们来讨论一下for循环｡
for循环将是所有关于重复代码｡
提醒一下,
重复代码是一种避免重复的方法, 实际上, 您可能一次执行多个类似的代码｡
因此, c编程语言有一些为该语言设计的构造,
当你想要重复代码时可以使用｡
这允许你重复一个语句块, 直到满足某个条件｡
它类似于for循环, 你要计算一个布尔表达式, 一个条件.
你不可能永远逃避｡
当你永远在循环中运行时, 这意味着它是一个无限循环｡
只有在某些时候,
你可能会想这样做, 通常是为了监听或收听某些东西｡
因此, 循环重复的次数可以简单地通过帐户来控制｡
有两种类型的循环, 你可以做, 一个计数器控制循环或像一个哨兵控制循环是他们所说的｡
计数器控制循环意味着循环运行10次､
20次､ 30次､ 特定的时间量｡
它会在循环内多次重复相同的陈述式区块｡
你可以有另一种类型的循环, 它不是计数器控制的｡
它可能运行5次, 可能运行100次, 可能想要20次,
这完全取决于一个条件, 一个变量或其他东西｡ 比如说,
你可以运行一个循环, 说我要一遍又一遍地运行我的循环, 直到用户输入quit｡
所以直到变量改变为退出｡ 它不是反控制的｡ 它不是依赖性的｡
同样, 它可能运行10次, 它可能运行100次｡
这是两种不同类型的回路｡
我将提供这两种情况的例子, 但请从更高的层次上考虑, 什么时候需要重复代码？
我可能需要在一定时间内重复代码5次, 或者根据用户输入的特定条件输入代码,
这称为“哨兵”｡
我们的for循环有for关键字｡ 它用于执行给定的次数｡
它通常用于反制, 但也不一定是｡
你可以把它用于计数器控制循环或一个哨兵控制循环｡
这取决于你｡ 但是在很多实践中,
很多例子都是反控制的, 在一定的时间内｡
例如, 如果要显示从1到10的数字, 则可以使用for循环｡
您不会希望使用相同的printf语句编写10行代码, 其中显示不同的数字｡
这是非常低效的｡ 这是非常耗时的｡
您可以使用for循环来重复代码｡
你要做的就是做这样的事情｡
下面介绍for循环的语法｡
你有for关键字, 然后你有这些括号｡
同样, 括号标识了for循环中正在进行的不同操作｡
然后你有一个括号, 括号里有语句｡
同样,
括号代表循环的主体, 就像括号代表if语句的主体一样｡
如果你有一个单一的语句在那里, 你不需要括号, 但良好的做法,
总是使用它们｡
在这个例子中, 你可以看到for这个关键词, 这应该是你首先要识别的东西｡
这个操作, 运行多长时间是受控的, 在for关键字后面的括号里出现了什么,
我们将详细讨论.
基本上有三种不同的表达方式｡
你能认出它们是因为它们是用分号隔开的｡
所以分号表示这是一个表达式语句｡
那么这三个东西在做什么呢, 我们来描述一下｡
你想要重复的动作在循环体中, 这是经常发生的事情.
在这个例子中, 循环的主体是printf｡
因此, 如果条件的计算结果为true, 它将继续打印该数字｡
同样, 对于单个语句, 可以省略大括号｡
让我们来详细了解一下｡
for循环的一般模式是这样的语句｡
你有一个for, 然后你有一个起始条件, 这是伪代码｡
我在这里试着描述for循环｡
所以起始条件是第一个东西, 一切都在第一个分号之前｡
第二个是延续条件,
在结尾有一个分号, 然后括号中的最后一个是每次迭代的操作｡
我想描述一下每一个｡ 然后是循环语句｡
循环语句非常简单｡ 那只是在身体里面｡
这是每次都要重复执行的代码｡
这很基本｡
同样, 如果有多个语句, 可以使用断开大括号, 如果只有一个语句,
则可以省略大括号｡
起始条件, 在第一个分号之前的括号内的第一个东西通常是但不总是它通常初始化一个变量,
称为循环控制变量.
这就是你在每次迭代时要开始考虑的变量｡
所以循环控制变量通常是一个计数器, 有时候, 不总是,
我想强调的是, 它不一定是｡
但在for循环中, 很多时候它是一个计数器, 它跟踪循环重复的频率.
这就是起始条件和循环控制变量的作用｡
您也可以在这里声明和初始化相同类型的多个变量, 声明之间用逗号分隔｡
所以这里可以有多个初始化变量｡
现在,
根据您使用的c编译器, 您可能无法在for语句中声明这些变量｡
如果你使用C99以下的编译器, 你必须在for语句之外声明变量然后你就可以在这里初始化它们, 这里的起始条件是,
我们会看一些例子.
但起始条件是初始化变量的地方｡
它是一个循环控制变量, 它的命名就是因为它控制着初始化时循环的执行频率.
接下来我想讲的是延续条件, 延续条件, 在for循环中,
第一个分号之后的部分.
这是一个逻辑表达式｡
这个条件的结果是真还是假.
这是你要跳进循环或退出循环的时候｡
这决定了循环是否应该继续执行｡
只要这个条件的值为true, 循环就会继续执行,
主体中的所有语句都会执行｡
这通常会检查循环控制变量的值｡
所以你在起始条件下初始化循环控制变量, 然后在延续条件下查看｡
只要你知道你在做什么, 你可以在这里放任何逻辑或任何算术表达式｡
在循环开始时而不是结束时测试继续条件｡
这被称为预测试循环｡
当我们讨论do-while循环时, 您会注意到其中的区别, 它是一个测试后循环｡
但这意味着循环语句可能被执行一次, 也可能被执行0次｡
这完全取决于该延续条件的计算结果是真还是假｡
如果它的值为false, 则永远不会执行主体｡
如果它的计算结果为true, 则至少执行一次该主体｡
每次迭代的动作, 在for循环的最后, 第二个分号之后,
通常会对循环控制变量做一些修改.
如果它是循环计数器,
它将递增或递减它;如果它是一个哨兵循环, 它可能会要求用户输入更多的输入｡
您也可以对一个变量进行多次修改｡
您可以修改循环控制变量, 也可以修改其它变量｡
你只需要用逗号把它们分开｡
但是总结一下我所说的一切, 我们有一个小表格来描述｡
但在我们讨论之前, 让我们看一个小例子｡
这里有一个例子｡ 我们有for关键字｡
然后你会注意到我们有int, I = 1, j
= 2, 这就是我们初始化变量的地方｡
我们实际上初始化了两个变量, 用逗号隔开,
通常在for循环中, 只初始化一个, 循环控制变量.
但在这个例子中, 我们初始化I和j｡
在分号后面, 我们有条件｡
我们什么时候进入, 什么时候退出这个循环｡
只要I小于等于5, 我们就进入.
这就是布尔表达式的值是真还是假｡
然后在第二个分号之后, 我们要修改循环控制变量, 或者任何其他我们关注的变量｡
这里我们要做一个加号, 加I, 这是一个增量运算符,
前缀I｡ 然后我们赋值j等于j加2｡
这通常是你的x条件, 修改循环控制变量｡
循环体只有一条语句, 所以不需要括号.
我们只是打印出I乘以j的值｡
因此,
此代码生成的输出将是单行上的值2､ 8､ 18､ 32和50｡
循环的第一次迭代, I等于1, j等于2｡
所以它会说I乘以j, 也就是1乘以2, 它会显示出来｡
它要检查以确保I不大于5, I不是1｡
所以它将返回并执行第二次｡
我们还修改了最后一条语句中的变量I｡
所以在第二次循环中, I将等于2｡
j将等于2加2等于4｡
现在我们要把2乘以4,
也就是8, 我们要把它显示出来, 然后我们要检查I是否大于5？
不, 我还是2｡
所以我们修改I,
使其等于3, 用于下一次迭代, 并且我们修改j, 使其等于4加2, 即6｡
然后在第三次循环中, 我们将I乘以J｡
所以我们说3乘以6, 显示为18｡
在执行第四次迭代之前, 我们检查I是否大于5｡
不, 是4｡ 然后我们再把它加1, 我们说它是5｡ 它等于5, 所以它仍然可以运行｡
然后我们做32, 然后我们做50｡
这是一个for语句｡
您希望在代码浏览器中运行并执行它, 并进行试验和更改｡
但是我们在这里做的是在一行代码中做3件独立的事情｡
我们正在初始化循环控制变量或任何其他变量｡
我们在第一个分号后面有一个布尔表达式, 也就是退出条件｡
然后我们修改循环控制变量和其他变量, 作为for语句的最后一部分｡
总结一下我们所做的我从一本书中找到了这个很好用的图表, 我想给你们看一下｡
这是对所有内容的总结｡
第一个分号初始化循环控制变量｡
在第一个分号之后, 我们要做条件, 布尔表达式｡
在第二个分号之后, 我们修改了循环控制变量｡
这是你看到的典型例子｡
这是一个计数器控制循环, 从1开始, 一直到10｡
所以这实际上要执行10次｡
键在那里小于等于10｡
所以你会看到关系运算符作为我们的条件, 就像我们看到关系运算符作为if语句的条件一样｡
这里的关键是你要修改那个循环控制变量, 否则你永远不会退出｡
所以加号加计数是非常重要的｡
至于递增前还是递增后, 不管加号是在变量之前还是变量之后,
你都不用担心, 因为它只会在循环迭代之后递增或递减, 所以你是用加号+计数还是计数++计数都没关系.
同样, 取决于你的编译器所运行的c语言版本, 你可以在for循环内声明变量count,
或者你可以在for循环外声明int
count等于1, 或者in count, 然后在第一个分号中初始化它｡
C99在for循环的同一部分添加了初始化和声明｡
但这基本上是for循环的工作原理｡
现在让我们看一个小例子, 我想向你们展示for循环的灵活性｡
这是一个例子, 我们要对一些整数求和.
在这个例子中, 我们将要求用户输入一个要求和的整数｡
我们将把它存储在一个叫做count的变量中｡
我们现在要用一个for循环遍历所有的变量,
取决于它们输入的数字, 迭代多少次.
这里我们说4, 我们有无符号整型数, 对于整型数I等于1,
不一定是无符号的｡ 我们正在初始化循环控制变量｡
然后我们说如果I小于, 那么我们就退出, 然后我们修改循环内容, 加,
加i.
所以这是要运行｡
同样, 将1与用户输入的数字10或20进行比较｡
我们要做的就是说sum等于sum加1｡
for循环非常强大, 因为for循环允许您修改许多变量｡
我们甚至不需要在for循环的主体中放入sum plus equal I｡
我们可以把它放在最后一个语句的末尾｡
所以除了把I加1之外, 我们还可以说sum plus等于I plus plus｡
所以我们在一行代码中完成了所有的工作, 这向您展示了灵活性｡
这完全是因为我们可以修改for语句中的变量｡ 我们不一定要有那排尸体｡
因此,
让我们以代码块的形式来看看这个示例, 以向您展示如何操作它, 并查看输出是什么｡
这是我们在课上讲过的例子｡ 我想继续尝试编译它｡
当我编译这个的时候, 你们会注意到我有一个错误｡
它说我不能在for语句中声明变量｡ 这是因为我运行的是旧版本的c编译器｡
我负责C89公路｡
你可能不会有这个｡
但是要解决这个问题, 如果你遇到这种错误,
你只需要在for循环之外声明它就可以了. 所以你就说无符号I｡
然后在for循环中, 初始化它,
就像这样.
现在让我们试着构建, 我只需要去掉一些格式说明符｡
所以当我编译成功,
运行这个程序时, 你们会看到循环是如何工作的｡
它会要求我输入要求和的整数｡ 如果我输入5,
它会和1234加5, 也就是15｡
我们可以在for循环中添加一个括号, 我们可以查看它运行了多少次,
我们可以添加一个print语句,
不一定要调试它, 但只是查看发生了什么, 我们可以说在循环内部.
这会告诉我们循环运行了5次, 因为它会运行I来计数｡
所以我想演示的是它运行了多少次｡
因此, 现在当我构建并运行它时, 我将看到每次迭代都发生了什么｡
所以我要我说8.
内循环, 内循环, 内循环, 我没有加换行符｡
所以很坚韧阅读, 但内部循环显示了8次｡
然后我把循环中的每一个数字加起来, 所以答案是36, 1 + 2 + 3 +
4 + 5 + 6 + 7 + 8｡
所以你可以玩这个｡
但是, 我们再次初始化循环控制变量｡ 我们检查一下退出的条件｡ 我们将在点击用户输入的内容后退出｡
如果用户输入8, 我们将运行8次, 然后我们必须修改I｡ 如果我们不修改这里的I, 你就会有一个永远循环｡
当你运行这个程序的时候, 它会永远运行下去｡
所以你会发现, 在你输入了这个数字之后, 你的程序永远不会退出｡
比如说我们输入6, 我按回车键, 看看发生了什么,
只是在里面打印循环｡ 它永远不会退出｡
这是一个无限循环｡ 所以最后一件事非常非常重要｡ 您总是希望修改循环控制变量｡
同样, 循环控制变量确定退出, 在本例中为I｡
因此, for循环使用得相当频繁｡
这是非常容易使用, 它允许你做3个不同的事情内的循环｡
初始化循环控制变量,
检查循环控制变量的退出条件, 然后修改该循环控制变量｡
这三件事你必须在一个循环中完成, 你可以在一个语句中完成｡
现在让我简单地讲一下无限循环｡
所以我刚才演示了一个无限循环｡ 这是你永远不能退出的地方｡
而且您没有义务在for循环语句中放置任何参数｡
实际上, 您可以故意编写一个无限循环｡
你要做的就是把分号放进去.
所以你会有一个有两个分号的for循环｡
如果你看到了, 那就意味着你在写一个无限循环｡
通常情况下,
你不希望有无限循环, 但是有时候, 因为没有继续循环的条件｡
循环将无限期地继续下去｡ 如果您要监视数据, 这有时会很有用｡
所以如果你在监控数据, 你可能会有一些东西在那里｡
通常, 当你有一个永久循环时,
你通常也会有一个睡眠, 它会暂停程序的执行, 也许是一秒钟, 这样你就可以监视一些东西｡
另一个可能会出现无限循环的用例是侦听连接｡
所以如果你在等待, 你在倾听连接, 或者如果你在拉一些东西来看一些东西,
你可以这样做｡
有些人认为你永远不应该拉, 你永远不应该听,
但这是另一种说法｡
对于一些无限的for循环来说, 这是唯一的情况｡
通过修改该循环控制变量, 尽可能避免无限循环｡
我希望这对你有帮助｡ 这是for循环｡
我们将在其中一个挑战中使用for循环, 这样我们会更加熟悉它｡
-谢谢—谢谢