010 - C++循环 (for、while)

本期我们将讨论 C++ 中的循环 loops

当我说循环的时候,通常指的是 for 循环和 while 循环。

简单来说,循环是当我们写代码时,需要多次执行同样的操作的时候使用,循环其实很简单。

比如,如果我们想打印 Hello World 5 次,我们可以复制粘贴这些代码 5 次,或者可以将这些代码放入一个函数内,然后调用这个函数 5 次。两种方法没什么差别,都是在代码中重复 5 次打印,我们应该这么做吗?其实这种情况下我们可以使用循环,让代码连续运行 5 次。

举个实际的例子。

循环在显示游戏方面是非常重要的,它可以用来显示游戏画面,如果你写了一个游戏你可能想让游戏继续下去,你不想运行游戏渲染一帧然后退出吧,那样太奇怪了,因为你是希望游戏保持运行的,要做到这一点,你需要的是使用游戏循环。

游戏循环的意思是说,当游戏在运行的时候,只要用户玩家还没有决定退出游戏,就要对游戏状态更新,渲染游戏界面,让所有的角色持续保持移动状态,持续做所有的事情,一遍又一遍,一帧接一帧。因此,循环对于程序非常的重要,他们被用在每一个程序中。

和上期讲过的条件语句一样,他们逻辑处理部分很相似,所以好好掌握,它们都是你写代码时的主要工具。

for 循环

首先我们讲 for 循环。

我的例子是之前的打印 hello world,如果运行代码,你会看到 hello world 打印到控制台 5 次。

#include <iostream>
#include "Log.h"

int main()
{
	Log("Hello World");
	Log("Hello World");
	Log("Hello World");
	Log("Hello World");
	Log("Hello World");

	std::cin.get();
}

然而,为了让我们更加舒服点,我们可以写一个 for 循环。

#include <iostream>
#include "Log.h"

int main()
{
    for(int i=0; i<5; i++)
    {
		Log("Hello World");
    }

	std::cin.get();
}

现在来解释一下以上代码。

for 循环开始于关键字 for。然后分为三段,这三个部分用分号隔开。

第一部分是一个变量的声明,通常这里会声明一个变量,我用的变量名是 i ,这是一种惯例,可能是代表 iterate 的首字母,这里确实有相关性,因为我们将要对它进行 iterate 迭代,当然你可以将这个变量取任何名字,他也不一定是整数,甚至也不一定非得是 0。

第二部分是一个条件,只要条件为真,就可以执行循环内部代码。在这个例子中,因为我们想让代码执行 5 次,所以写的条件是 i < 5

最后的部分会在 for 循环的下一次送代之前执行,在这个例子中,我们写 i++,这个和 i+=1 或者 i=i+1 是一个意思,这里的意思就是要将起始于 0 的变量 i 增加 1,for 循环的每一次送代,i 都会增加1。

然后就是我们 for 循环的循环体。

这个循环体就是将要被循环的部分,也就是会被多次执行的代码,当然,条件决定了这些代码是否会被执行,有可能循环 1 次,也有可能循环 100 次,这都取决于条件。我们把一个 log 函数调用放进 for 循环内。

我们按 F5 运行,你会看到同样的结果 ,打印 5 次 Hello World。

那么他是如何运行的呢?我们来更加深入了解一下。

首先做的就是声明一个变量,我们申明了一个新的变量,赋初始 值为 0 ;接下来就要看这个条件是否满足,如果条件为真,我们会跳到 for 循环体里面,执行 for 循环内部的代码,当我们完成了 for 循环体,到达尾部的大括号时,会回到括号的第三部分执行代码。这些做完后,我们看这个条件是否为真,i 之前是 0,现在加上了 1,我们检查 i 是否小于 5,当然是真,所以我们跳回到函数体中继续执行,…,这个过程会一直持续,直到 i 等于 4。这时候运行完循环体跳到 i++,i 等于了5,我们比较 5 是否小于 5,显然 5 并不小于 5,因此条件为假。这意味着将会跳出循环到 std::cin.get(); ,这就是 for 循环重复运行 5 次的实际过程。

现在我想再次强调一下 for 循环括号内的三段语句语句。

第一段是开始 for 循环开始时会运行一次,第二段是一个比较后的 bool 类型,它将在每次循环体开始前进行评估,第三段看上去是要在循环体结束后被运行。

我们也可以把变量 i 的声明放在 for 循环之前,然后让 for 里面的第一段完全空着,然后将 i++ 放到最后,这些都是有效代码,结果都一样。

#include <iostream>
#include "Log.h"

int main()
{
    int i = 0;
    for( ; i<5; )
    {
		Log("Hello World");
        i++;
    }

	std::cin.get();
}

因为我们没有改变代码的实际行为,我们只是移动了代码的位置。

同样的,我们可以建立一个 名叫 condition 的 bool 变量作为循环条件。在合适的时机结合 if 分支语句修改循环条件。

#include <iostream>
#include "Log.h"

int main()
{
    int i = 0;
    bool condition = true;
    for( ;  condition; )
    {
		Log("Hello World");
        i++;
        if(!(i<5))
             condition = false;
    }

	std::cin.get();
}

运行代码,现依然可以像之前一样正常运行。

因为我们并没有改变程序的行为,我们只是稍微用不同的写法重写了代码。

for 循环是比较灵活的,不一定非要 i=0、i++之类的,可以包含任何你想要的语句,你当然还可以在 for 循环里调用函数等等,实际上有无限可能,你也可以完全去掉条件语句,这就相当于是无限循环,除非手动停止,否则它永远不会结束。

for 循环非常简单,对于你要运行很多次的代码,真的非常方便,另外,他们在做遍历数组之类的事情的时候,也非常有用。

接下来,让我们讨论下一个事情 while 循环。

while 循环

while 循环和 for 循环一样,它只是没有开头的申明,仅有条件语句,下面的代码和上面的 for 循环作用是一样的。

#include <iostream>
#include "Log.h"

int main()
{
    for(int i=0; i<5; i++)
    {
		Log("Hello World");
    }

    int i = 0;
    while(i < 5)
    {
        Log("Hello World");
        i++;
    }
    
	std::cin.get();
}

详细解释一下。

我们写 while 循环时,先输入 while 关键字,然后在里面输入条件,如果我们运行程序,它会先判断里面的条件,只要条件为真,就会执行循环体中的代码,运行以上程序,你会看到两种循环得到完全一样的结果。

那为什么我们用一个循环而不用另外一个循环,这就看你是否需要变化,因为循环的内容都是一样的,你可以交换使用,它更像一种习惯或者风格,而不是规矩,这两种循环没有什么实质性的区别,他们可以做完全一样的事情。

但是有一种习惯约定是,如果你有一个已经存在的确定的条件,你只是想做一些比较,例如前面提到的游戏循环,假设那里有一个变量叫做 running,你可能想让这个游戏持续循环,只要这个 running 变量为 true 即可,因为running 等于 true 意味着你的程序在持续。如果要做类似于这样的事情的时候,我可能会用 while 循环,因为条件是不变的,我不需要在每次循环之后改变这个条件,不需要在循环前先声明这个条件变量,我们可以将之前的变量或者函数调用后的结果拿来用,实际上不需要保持更新或者初始化某些东西。

然而当我们处理数组的时候,数组是有确定长度的,例如我的数组有 10 个元素,那我将会使用 for 循环来执行遍历,因为,我想让代码循环 10 遍,而且我还想要跟踪某些变量,而且这些变量可用于处理数组中的元素。在处理的过程中,需要一个偏移量或者叫索引的东西来处理元素,这些我们后面会再讲,对于 i 这个变量,在循环的过程中其值为 0,1,2,3,4, 当我们的迭代进行的时候,它和数组的索引完全一致,非常符合我们的要求。

其他循环

本期我们学习了 for 和while 循环,但实际上还有一种循环,叫做 do while,不过现在不太有用了,我个人不常用,不过它确实存在而且在某些场合下还有点作用,相比 for 和 while 不太常见。

#include <iostream>
#include "Log.h"

int main()
{
    for(int i=0; i<5; i++)
    {
		Log("Hello World");
    }

    int i = 0;
    while(i < 5)
    {
        Log("Hello World");
        i++;
    }
    
    i = 0;
    do
    {
        Log("Hello World");
        i++;
    }while(i < 5);
    
	std::cin.get();
}

我们先写上 do 关键字,形式如上,它和 while 循环唯一的区别是 不管如何先执行循环体一次

例如,我们把代码变成如下,它会只运行一次函数体。

#include <iostream>
#include "Log.h"

int main()
{
    for(int i=0; i<5; i++)
    {
		Log("Hello World");
    }

    int i = 0;
    while(i < 5)
    {
        Log("Hello World");
        i++;
    }
    
    bool condition = false;
    do
    {
        Log("Hello World");
    }while(condition);
    
	std::cin.get();
}

就这么多,这就是 do while 循环。

最后

以上就是本期的内容了,希望你们喜欢这个对于循环的简单介绍,我们会在整个系列中大量使用循环,它会在你几乎所有能想到的算法中被使用,循环对数组非常有用,我们将来会谈到如何使用循环来处理数组,这些都是紧密相连的,未来我们会深入探讨在汇编及 CPU 指令上的循环。

本期就是这些,下期再见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值