1. 概述
本篇文章主要讨论循环loops,当我们说循环时,通常指的是for循环和while循环。简单来说,循环是当我们写代码时,需要多次执行同样的操作时会用到的一种语法。因此,循环很简单。
例如,如果我们想打印"Hello World"5次,当然我们可以复制粘贴这些代码5次,或者将这些代码放入到一个函数中,然后调用这个函数5次。反正就是在代码中重复5次。这种情况下我们可以使用循环,可以让代码连续的运行5次。
循环在现实图片方面也是非常重要的。可以用来显示游戏,如果你写了一个游戏,你可能想让游戏继续下去,你不想运行游戏,渲染一帧然后退出,游戏一帧就结束了。其实你是希望游戏保持运行下去,要做到这点,我们需要的是游戏循环。当游戏在运行的时候,只要玩家还没有决定退出游戏,就需要对游戏状态更新,渲染游戏,让所有角色持续保持移动状态等,持续做一些事情,一遍又一遍,一帧接一帧。因此,循环是很重要的,他们被用在每一个程序中。
2. 案例
1. 准备项目
我们有一个简单的项目,项目中有三个文件,分别是Main.cpp,Log.h,Log.cpp。内容如下
2. 开始案例
如果我们想要打印"Hello World"5次,我们可以通过复制粘贴调用这个Log
函数5次做到。
F5
运行代码
可以看到,"Hello World"在控制台打印了5次。
1. for循环
下面使用for循环的方式来简化这个过程
我们可以先写一个for循环,for循环开始于关键字for,后接口号。括号内分三个部分,这三个部分都用;
隔开。
css
第一部分:是一个变量的声明,通常你需要在这里声明变量,也可以在外面声明。这里写`int i = 0`,变量名去i,是一种习惯,有可能是iterate的首字母,当然这个变量名可以取任何名字,这个变量不一定要是整数,甚至也不一定要等于0。
第二部分:是一个条件,只要这个条件的结果为真,那么我们将执行for循环内部的代码(循环体)。在这个例子中想让Log函数执行5次,所以我们给的条件应该是`i < 5`,因为第一部分i的初始值是0。
第三部分:这部分会在for循环的下一次迭代之前被调用。在这个例子中我们写`i++`,这里的意思是要将没循环一次后变量i增加1。
`i++`和`i += 1` 或者 `i = i + 1`是一个意思。
然后我们写for循环的循环体,这个循环体就是将要被循环的部分,也就是会被多次执行的代码。当然,这些条件决定了这些代码是否会被执行。有可能执行1次,也有可能执行100次,这取决于循环条件。这里的循环体就是Log("Hello World");
去掉多余的log函数调用。
修改后的代码如下
我们按下F5运行代码
可以看到实现了一样的效果。
下面我们更深入一点
当指针执行到for (int i = 0; i < 5; i++)
这一行的时候,首先要做的就是声明这个变量,不管写的什么都要先声明。在本例中声明了一个新的变量
i
,然后接下来就要看i < 5
这个条件
是否满足,如果条件为真,我们就会跳到for循环里面,执行for循环内部的代码Log("Hello World");
,当我们完成了for循环体
,到达for循环尾部的大括号}
时,程序会回到for (int i = 0; i < 5; i++)
这行,执行i++
,执行完i++
,会再进行条件判断i < 5
是否为真,当然i开始为0,循环一轮后i++,i变为了1,我们检查条件1是否小于5,当然是小于5,所以又去执行循环体
,然后重复这个过程,直到i = 4,运行完循环体,跳到i++
,然后i = 5,我们比较5是否小于5,显然5并不小于5,条件返回false时,跳出循环,循环结束。这就是for循环重复运行5次的实质。
现在,我想强调,for循环括号里面的三部分,第一段是开始for循环时会运行一次,第二段是一个比较后的bool类型,它会评估是否执行循环体,第三段看上去是要在for循环的最后被执行。
我们可以把变量i的声明放在for之前,然后让for后面的第一部分空着。
我们也可以将i++放入循环体最后一步
这样的结果也是一样。
我们F5运行程序
看到结果是一样。虽然看起来有点怪,但是不影响结果,因为我们没有改变代码的实际行为。我们只是移动了代码的位置。
同样的,我们可以创建一个bool变量,取名condition或其他,将其设为true,然后把这个condition的值作为条件。再循环体内做完i++后,我们写上if i 不小于5,我们就设置condition为false。
F5运行程序
可以看到,结果依然是一样的。因为我们没有改变程序的行为。我们只是稍微用不同的写法重写了代码。这只是告诉你,for循环可以做任何重复执行的事。不一定非要按for(int i = 0; i < 5; i++)
这样写之类的。他们可以包含任何你想要的语句。你当然还可以在for循环中调用函数等等。
你也可以将for后面第二部分完全不写
不写,相当给了条件为true,如果我们运行代码,就变成了无限循环。
F5运行程序
你可以看到不断的打印"Hello World",可以看到程序会一直运行下去,除非我们手动停止(Shift + F5)。
OK,就这么多,for循环真的非常简单。另外,他们在遍历数组之类的事情的时候,也非常有用。
2. while循环
接下来,我们看看while循环
while循环和for循环功能一样,不过while循环没有for循环的第一部分和第三部分,仅有条件语句。
我们写while循环时,先输入while关键字,后接括号输入循环结束条件,如下改造代码
我在他们两个之间打上一堆==========
用来分开他们。
按下F5运行代码。
可以看到两次循环得到完全一样的结果。都是将"都是将Hello World"打印5次。
那这两种循环,该用哪种呢,这就看你是否需要变化,因为循环的内容都是一样的,你都可以交换使用,它更像一种习惯或风格,而不是规矩。这两种循环没有什么实质性的区别,他们可以做完全一样的事情。
但是有一种习惯约定,如果你有一个已经存在的确定条件,你只是想做一些比较,例如前面提到的游戏循环,那里有个变量叫做running,你可能想让游戏持续循环,只要这个running变量为true即可,因为running等于true,意味着你的程序在持续运行,如果要做类似于这样的事情的时候,我可能会使用while循环,因为条件是不变的,我不需要在每次循环之后改变这个条件,我们不需要在循环前先声明这个条件变量,我们可以将之前的变量或者函数调用后的结果拿来用,实际上不需要保持更新或者初始化某些东西。
然后当我们处理数组的时候,一个确定长度的数组,例如我们的数组有10个元素,那我们可以使用for循环,因为我想让代码循环10遍,因此我想要跟踪某些变量,仅仅循环10次。而这些变量可用于处理数组中的元素,因为如果我想要处理10个元素长度的数组中的元素时,我需要一个偏移量或者叫做索引的东西来处理元素,这些在后面数组内容中会介绍到。对于i这个变量,我们要跟踪它从0, 1, 2, 3, 4...,当我们的迭代进行的时候,这和数组的索引完全一致,非常适合。
3. do while循环
我们学习了for和while循环,实际上还有一种循环do while循环,不过不太常用,但是它确实存在而且还有点作用。但相比于for和while来说,不太常见。
我们先写上do关键字,然后执行循环体,然后再在后面写上while,while后面跟上循环条件。do while
和while
的唯一区别就是,do while
无论如何都会先执行一次,我们修改下代码如下。
F5运行代码
可以看到do while
执行了一次。
以上就是这篇的所有内容,关于循环的一些简单介绍,后续的篇章中会大量使用到循环,它会在你几乎所有能想到的算法中被使用。循环也对数组非常有用,我们后面也会介绍到如何使用循环来处理数组。