C++编程基础: 8. 循环语句结构
2025-04-13 07:58:45
本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们主要讲讲循环语句结构。
如果我们希望重复执行一系列的操作,直到满足一定条件时再跳出重复执行的操作,继续执行剩下的程序时,就需要使用循环语句结构了。
do-while循环
do-while结构里的循环体至少会被执行一次,运行起来就是做某些操作,当条件表达式的值为真时继续做。这个结构里的while(条件表达式)后面的分号不能省略,可以理解为整个do-while结构是一个单语句。
do{
循环体
}while(条件表达式);
这里我们可以用do-while结构来对前一节条件语句结构的课里为变量输入一个整数判断其范围的程序进行修改,使其重复判断输入整数的范围,直到输入0为止。
do{
<<"Please input an integer:"<<endl;
cout>>x;
cin(x>10){
if<<"x is greater than 10."<<endl;
cout(x==15){
if<<"x is equal to 15."<<endl;
cout}
}else if(x<5){
<<"x is less than 5."<<endl;
cout}else{
<<"x is between 5 and 10."<<endl;
cout}
}while(x!=0);
在循环结构中,用于判断满足条件表达式里面的变量x值是否变化,且是否能够达到条件不成立的值很重要,例如本例中x的值由用户的输入决定,当输入0时该条件表达式的值为假,即可跳出该循环,如果不能保证x能得到0的输入,该程序就会陷入死循环的情况。
while循环
另一种循环的实现使用的是while语句结构:
while(条件表达式){
循环体
}
和do-while至少执行一次循环体不同,while语句结构里如果条件表达式不成立,循环体可能一次都不会执行,当条件表达式成立时,程序将执行循环体里的内容,然后再次检查关键字while后面的条件表达式是否成立,如果成立则继续执行循环体里的内容,直到条件表达式不成立时才退出循环。这里的while(条件表达式)后面没有分号,如果多出分号,实际执行的是空语句。
为了避免陷入死循环的陷阱,循环体中应该有能够改变跟在while后面的条件表达式结果的语句,让循环能可以走向终结。
如果我们要计算从1到100整数的和,让计算机实现就可以用while语句结构帮忙:
=1, sum=0;
int iwhile(i<=100){
=sum+i;
sum++;
i}
<<"sum = "<<sum<<endl; cout
输出结果: sum = 5050
这段程序里i++十分重要,它的存在才能让i不断增加最后达到退出循环的条件。
for循环
另外一种更为复杂但是很常用的循环结构是for循环。
for(初始化循环变量的表达式1;判断是否继续执行的条件表达式2;改变循环变量值的表达式3){
循环体
}
表达式1:初始化用来计数的循环变量(或称为迭代器),只运行1次,一般这里还包含变量的声明,这样这个变量的作用域只限于当前的for循环之中
表达式2:每次开始执行循环体前检查退出条件是否成立
表达式3:一般是对循环变量进行递增或递减操作
同样是计算从1到100整数的和,用for循环可以这样来实现:
=0;
sumfor(int i=1;i<=100;i++){
=sum+i;
sum}
<<"1+2+3+..+100 = "<<sum<<endl; cout
输出结果: 1+2+3+..+100 = 5050
当需要遍历一个数组的每一项来进行操作时,常常使用for循环结构。例如,要计算一个存着各科分数的数组中分数的总和:
[5]={67,89,65,98,86};
int scores=0;
int totalScoresfor(int i=0;i<5;i++){
=totalScores+scores[i];
totalScores}
<<"totalScores = "<<totalScores<<endl; cout
输出结果:
totalScores = 405
另外,c++11引入的一种基于范围的for循环结构,让for循环对一个数据集的操作更为简洁:
for(变量类型 变量名:变量值所属的数据集){
循环体
}
这个循环结构用自己的机制在每次循环时将数据集中的每项依次赋给了变量。
同样是实现计算一个存着分数的数组中分数的总和,用基于范围的for循环结构来改写:
[5]={67,89,65,98,86};
int scoresint totalScores=0;
for(int i:scores){
=totalScores+i;
totalScores}
<<"totalScores = "<<totalScores<<endl; cout
输出结果: totalScores = 405
用break;或continue;来干预循环的执行
在switch-case结构中,我们遇到了break语句,当它出现在循环体,轮到它执行时,它同样会让程序跳出当前的循环结构。循环时如果遇到continue;则会让循环跳转至下一次循环的执行。
上面计算总分的例子,如果只想求那些分数大于70的科目分数总和,可以使用continue语句让循环碰到小于70分的数值时终止本次循环体的执行而跳到下一次循环继续执行。
[5]={67,89,65,98,86};
int scores= 0;
int totalHighScores for(int i:scores){
(i<70)
if;
continue=totalHighScores+i;
totalHighScores}
<<"totalHighScores = "<<totalHighScores<<endl; cout
输出结果: totalHighScores = 273
而如果这里改用break来替换continue,则不会得到预期的结果。
[5]={67,89,65,98,86};
int scores= 0;
int totalHighScores for(int i:scores){
(i<70)
if;
continue=totalHighScores+i;
totalHighScores}
<<"totalHighScores = "<<totalHighScores<<endl; cout
输出结果: totalHighScores = 0
这里,当程序遇到数组里的第一项67时,一看小于70,break就让程序直接跳出了整个循环,继续执行循环外的程序去了,因此打印出来的值为0。
无限循环
有了像break这样可以让程序从循环体里跳出的语句,在设置循环语句结构里的循环条件时,可以将条件设置为永远为真:
do{
循环体
}while(true);
while(true){
循环体
}
对于for循环,无限循环只需将跟在for后面的3个表达式省略,保留用来分隔的分号:
for(;;){
循环体
}
这样的无限循环结构,就务必要在循环体中加入像break这样可以退出循环的语句和相应的条件判断,以免陷入死循环的困境。