前言
C++中当说循环的时候,通常指的是 for 循环和 while 循环。
简单来说,循环是当我们写代码时,需要多次执行同样的操作的时候使用,循环其实很简单。
比如,如果我们想打印 Hello World 5 次,我们可以复制粘贴这些代码 5 次,或者可以将这些代码放入一个函数内,然后调用这个函数 5 次。两种方法没什么差别,都是在代码中重复 5 次打印,我们应该这么做吗?其实这种情况下我们可以使用循环,让代码连续运行 5 次。
for 循环
首先我们讲 for 循环。
我的例子是之前的打印 hello world,如果运行代码,你会看到 hello world 打印到控制台 5 次。
#include <iostream>int main()
{std::cout<< "hello world" <<std::endl;std::cout<< "hello world" <<std::endl;std::cout<< "hello world" <<std::endl;std::cout<< "hello world" <<std::endl;std::cout<< "hello world" <<std::endl;return 0;
}
然而,为了让我们更加舒服点,我们可以写一个 for 循环。
#include <iostream>int main()
{for (int i = 0; i < 5; i++){std::cout<< "hello world" <<std::endl;}return 0;
}
现在来解释一下以上代码。
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 次,这都取决于条件。我们把一个 cout函数调用放进 for 循环内。
首先做的就是声明一个变量,我们申明了一个新的变量,赋初始 值为 0 ;接下来就要看这个条件是否满足,如果条件为真,我们会跳到 for 循环体里面,执行 for 循环内部的代码,当我们完成了 for 循环体,到达尾部的大括号时,会回到括号的第三部分执行代码。这些做完后,我们看这个条件是否为真,i 之前是 0,现在加上了 1,我们检查 i 是否小于 5,当然是真,所以我们跳回到函数体中继续执行,......,这个过程会一直持续,直到 i 等于 4。这时候运行完循环体跳到 i++,i 等于了5,我们比较 5 是否小于 5,显然 5 并不小于 5,因此条件为假。这意味着将会跳出循环 ,这就是 for 循环重复运行 5 次的实际过程。
for循环的变式
现在我想再次强调一下 for 循环括号内的三段语句语句。
第一段是开始 for 循环开始时会运行一次,第二段是一个比较后的 bool 类型,它将在每次循环体开始前进行评估,第三段看上去是要在循环体结束后被运行。
我们也可以把变量 i 的声明放在 for 循环之前,然后让 for 里面的第一段完全空着,然后将 i++ 放到最后,这些都是有效代码,结果都一样。
#include <iostream>int main()
{int i = 0;for (; i < 5;){std::cout<< "hello world" <<std::endl;i++;}return 0;
}
因为我们没有改变代码的实际行为,我们只是移动了代码的位置。
同样的,我们可以建立一个 名叫 data的 bool 变量作为循环条件。在合适的时机结合 if 分支语句修改循环条件。
#include <iostream>int main()
{bool data = true;int count = 0;for (; data;){count++;if(count >=5)data = false;std::cout<< "hello world" <<std::endl;}return 0;
}
运行代码,现依然可以像之前一样正常运行。
因为我们并没有改变程序的行为,我们只是稍微用不同的写法重写了代码。
for 循环是比较灵活的,不一定非要 i=0、i++之类的,可以包含任何你想要的语句,你当然还可以在 for 循环里调用函数等等,实际上有无限可能,你也可以完全去掉条件语句,这就相当于是无限循环,除非手动停止,否则它永远不会结束。
for 循环非常简单,对于你要运行很多次的代码,真的非常方便,另外,他们在做遍历数组之类的事情的时候,也非常有用。
接下来,让我们讨论下一个事情 while 循环。
while 循环
while 循环和 for 循环一样,它只是没有开头的申明,仅有条件语句,下面的代码和上面的 for 循环作用是一样的。
#include <iostream>int main()
{bool data = true;int count = 0;for (; data;){count++;if(count >=5)data = false;std::cout<< "hello world" <<std::endl;}std::cout << "######################################" << std::endl;count = 0;while (count<5){std::cout<< "hello world" <<std::endl;count++;}return 0;
}
详细解释一下。
我们写 while 循环时,先输入 while 关键字,然后在里面输入条件,如果我们运行程序,它会先判断里面的条件,只要条件为真,就会执行循环体中的代码,运行以上程序,你会看到两种循环得到完全一样的结果。
平时如何选择循环的类型呢?
那为什么我们用一个循环而不用另外一个循环,这就看你是否需要变化,因为循环的内容都是一样的,你可以交换使用,它更像一种习惯或者风格,而不是规矩,这两种循环没有什么实质性的区别,他们可以做完全一样的事情。
但是有一种习惯约定是,如果你有一个已经存在的确定的条件,你只是想做一些比较,
while循环
例如游戏循环,假设那里有一个变量叫做
running
,你可能想让这个游戏持续循环,只要这个running
变量为 true 即可,因为running 等于 true 意味着你的程序在持续。如果要做类似于这样的事情的时候,我可能会用 while 循环,因为条件是不变的,我不需要在每次循环之后改变这个条件,不需要在循环前先声明这个条件变量,我们可以将之前的变量或者函数调用后的结果拿来用,实际上不需要保持更新或者初始化某些东西。
for循环
然而当我们处理数组的时候,数组是有确定长度的,例如我的数组有 10 个元素,那我将会使用 for 循环来执行遍历,因为,我想让代码循环 10 遍,而且我还想要跟踪某些变量,而且这些变量可用于处理数组中的元素。在处理的过程中,需要一个偏移量或者叫索引的东西来处理元素,这些我们后面会再讲,对于 i 这个变量,在循环的过程中其值为 0,1,2,3,4, 当我们的迭代进行的时候,它和数组的索引完全一致,非常符合我们的要求。