循环与程序控制结构
我们目前为止 程序都是从上往下 从左往右执行的。
有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。
编程语言提供了允许更为复杂的执行路径的多种控制结构。
循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的一般形式:
C++ 提供四种基本循环方式,其实真正是三种 while ,do while 和for
后面我们逐一讲解
while 循环
只要给定的条件为真,while 循环语句会重复执行一个目标语句。
一般结构如下
while(condition)
{
statement(s);
}Code language: JavaScript (javascript)
在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。
condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。
当条件为假时,程序流将继续执行紧接着循环的下一条语句。
在这里,while 循环的关键点是循环可能一次都不会执行。当条件被测试且结果为假时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 10;
// while 循环执行
while( a < 20 )
{
cout << "a 的值:" << a << endl;
a++;
}
return 0;
}Code language: PHP (php)
为了避免死循环 我们应该要在循环体里面 修改一些值 使得条件不成立。否则永远都会执行。
while(0)//非0就是true
{
cout << "执行了循环" << endl;
}
int i = 0;
while (i<10)
{
cout << i << endl;
i++;
}
cout << "循环结束" << endl;Code language: JavaScript (javascript)
do…while 循环
不像 for 和 while 循环,它们是在循环头部测试循环条件。do…while 循环是在循环的尾部检查它的条件。
do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。
一个是先判断后执行
一个是先执行后判断。
也就是 while是先判断条件 然后再看真假 执行循环体。如果条件一开始就是假 则一次都不会执行循环体。为真则执行循环体 然后再判断。
而do while 则先执行一次循环体 然后判断条件。如果条件为假 则 往下一条语句执行。为真则执行下一次循环体
do
{
statement(s);
}while( condition );Code language: JavaScript (javascript)
请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。
如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 10;
// do 循环执行
do
{
cout << "a 的值:" << a << endl;
a = a + 1;
}while( a < 20 );
return 0;
}Code language: PHP (php)
下面是我们的代码
while(0)//while循环
{
cout << "执行了while循环" << endl;
}
do
{
cout << "执行了do while循环" << endl;
} while (0);Code language: JavaScript (javascript)
输出0-9 使用do while循环
int i = 0;
do
{
cout << i << endl;
++i;
} while (i<10);Code language: JavaScript (javascript)
do while和while的区别 例子演示
int i = 10;
//while (i<10)
//{
// cout << i << endl;
// ++i;
//}
do
{
cout << i << endl;
++i;
} while (i<10);Code language: JavaScript (javascript)
for 循环
for 循环允许您编写一个执行特定次数的循环的重复控制结构
for ( init; condition; increment )
{
statement(s);
}
下面是 for 循环的控制流:
init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
接下来,会判断 condition。如果为真,则执行循环主体。
如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。是{}循环体后面的语句。
在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
#include <iostream>
using namespace std;
int main ()
{
// for 循环执行
for( int a = 10; a < 20; a = a + 1 )
{
cout << "a 的值:" << a << endl;
}
return 0;
}Code language: PHP (php)
基于范围的for循环(C++11)
int my_array[5] = {1, 2, 3, 4, 5};
// 每个数组元素乘于 2
for (int &x : my_array)
{
x *= 2;
cout << x << endl;
}
// auto 类型也是 C++11 新标准中的,用来自动获取变量的类型
for (auto &x : my_array) {
x *= 2;
cout << x << endl;
}Code language: JavaScript (javascript)
我们的代码
for循环可以使用while循环来实现
看下面的例子 计算1到100的自然数之和
//计算1到100的自然数 之和
int sum = 0;
int i = 1;
while (i<=100)
{
sum = sum + i;
i++;
}
//当i=101就退出循环体
cout << sum << endl;Code language: JavaScript (javascript)
下面是使用for循环实现
int sum = 0;
for (int i = 1; i <=100; i++) //两个分号 隔开三部分 第一部分 通常用来初始化变量 第二部分是循环条件 第三部分是改变条件
{
sum = sum + i;
}
cout << sum << endl;
//计算1到100的自然数 之和
int sum = 0;
int i = 1;
for (;i<=100;)//for循环的第一和第三部分可以不写 这时候就等同于 while循环
{
sum = sum + i;
i++;
}
//当i=101就退出循环体
cout << sum << endl;Code language: JavaScript (javascript)
嵌套循环
一个循环内可以嵌套另一个循环。C++ 允许至少 256 个嵌套层次。
比如 可以在while循环里面有while循环 再里面再有while循环 理论上 支持256层嵌套。
还可以是 for循环里面有while循环 或者while有for 或者dowhile 有while 反正就是这三种循环可以互相嵌套。
for ( init; condition; increment )
{
for ( init; condition; increment )
{
statement(s);
}
statement(s); // 可以放置更多的语句
}Code language: JavaScript (javascript)
此外 while do while 也可以嵌套。
三种循环 也可以互相嵌套。
例子 计算2到100 之间的质数
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
就是除了1和本身可以整除 没有第三个数。
#include <iostream>
using namespace std;
int main ()
{
int i, j;
for(i=2; i<100; i++) {
for(j=2; j <= (i/j); j++) {
if(!(i%j)) {
break; // 如果找到,则不是质数
}
}
if(j > (i/j)) {
cout << i << " 是质数\n";
}
}
return 0;
}Code language: PHP (php)
60/2 = 30
31 32 –59
61/2=30
//60
// j = 2 30
// j = 3 20
// j = 4 15
//j = 5 12
//j = 6 10
//j 9 6
循环控制语句
在循环体里面 可以进行跳转。可以跳过本次循环 也可以跳出整个循环 。
如果我们希望在循环体内部 跳出循环 或者直接进入到下次循环 那么怎么办?
C++ 提供三个语句
break 语句
C++ 中 break 语句有以下两种用法:
当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
它可用于终止 switch 语句中的一个 case。
如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。也就是break 只能跳出它所在的最内层循环。
C++ 中 break 语句的语法:
break;
#include <iostream>
using namespace std;
int main()
{
int a = 10;
// do 循环执行
do
{
cout << "a 的值:" << a << endl; //a在下面是16 但是在这里还是15
a = a + 1;
if (a > 15) //当a==16就会执行if里面的代码
{
// 终止循环
break;
}
} while (a < 20);
return 0;
}Code language: PHP (php)
#include <iostream>
using namespace std;
int main()
{
//计算1到100 之间第一个能同时被3和5整除的数
int i = 1;
while (i <= 100)
{
if (i % 3 == 0 && i % 5 == 0)
{
cout << i << endl;
break;
}
//cout << i << endl;
i++;
}
return 0;
}Code language: PHP (php)
continue 语句
C++ 中的 continue 语句有点像 break 语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。
对于 for 循环,continue 语句会导致执行条件测试和循环增量部分。
另外 一般执行break等语句都是有 if条件的 否则如果没有条件 那么循环就只能执行一次
int a = 10;
// do 循环执行
do
{
cout << "a 的值:" << a << endl; //a在下面是16 但是在这里还是15
a = a + 1;
break;
} while (a < 20);
return 0;Code language: JavaScript (javascript)
对于 while 和 do…while 循环,continue 语句会导致程序控制回到条件测试上。
continue;
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 9;
// do 循环执行
do
{
a = a + 1;
if( a == 15)
{
// 跳过迭代
continue;
}
cout << "a 的值:" << a << endl;
}while( a < 20 );
return 0;
}Code language: PHP (php)
我们的例子
#include <iostream>
using namespace std;
int main()
{
int a = 10;
// do 循环执行
do
{
cout << "a 的值:" << a << endl; //a在下面是16 但是在这里还是15
a = a + 1;
if (a>15)
{
continue;
}
cout << "------" << endl;
} while (a < 20);
return 0;
}Code language: PHP (php)
continue的目的是跳过本次循环 不在执行下面的代码 直接到达判断条件 然后根据条件结果是否执行下次循环
goto 语句
goto 语句允许把控制无条件转移到同一函数内的被标记的语句。
注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。
goto 就好比 “虫洞” 一样 可以瞬间移动到另外一个位置。
语法结构
goto label;
..
.
label:
statement;Code language: PHP (php)
在这里,label 是识别被标记语句的标识符,可以是任何除 C++ 关键字以外的纯文本。标记语句可以是任何语句,放置在标识符和冒号(:)后边。
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 10;
// do 循环执行
LOOP:
do
{
if( a == 15)
{
// 跳过迭代
a = a + 1;
goto LOOP;
}
cout << "a 的值:" << a << endl;
a = a + 1;
}while( a < 20 );
return 0;
}Code language: PHP (php)
goto 语句一个很好的作用是退出深嵌套例程。例如,请看下面的代码片段:
goto可以跳出多层循环。不管怎么样 都是无条件
for(...) {
for(...) {
while(...) {
if(...) goto stop;
.
.
.
}
}
}
stop:
cout << "Error in program.\n";Code language: PHP (php)
我门的代码
#include <iostream>
using namespace std;
int main()
{
cout << 1 << endl;
cout << 2 << endl;
goto bamn;
cout << 3 << endl;
cout << 4 << endl;
cn:
cout << 5 << endl;
bamn:
cout << 6 << endl;
goto cn;
return 0;
}Code language: PHP (php)
无限循环
如果条件永远不为假,则循环将变成无限循环。什么时候用到死循环?
通常在一些需要监测的地方,定时去读取某些数据,我们要开发一个闹钟,这时候我们可以使用死循环。不断去监测这个时间。如果时间到达这个设定的时间 那么就报时。
比如
while(true)
{
}Code language: JavaScript (javascript)
例子
#include <iostream>
using namespace std;
int main()
{
while (true)
{
cout << "Foxdevelop" << endl;
}
return 0;
}Code language: PHP (php)
for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。
#include <iostream>
using namespace std;
int main ()
{
for( ; ; )
{
cout<< "This loop will run forever.\n";
}
return 0;
}Code language: PHP (php)
#include <iostream>
using namespace std;
int main()
{
for (;;) //使用两个分号 不写其他的表达式 也可以实现死循环
{
cout << "Foxdevelop" << endl;
}
return 0;
}Code language: PHP (php)