跳转到内容

循环语句

循环结构中,程序会重复地执行同一段代码,直到条件不满足,或者遇到强行跳出循环的语句。循环结构主要包括while循环、do while循环、for循环三种,这三种循环可以相互转化。所谓循环控制就是通过循环控制变量和表达式,以及break语句、continue语句和goto语句,控制程序的重复执行过程,当不符合循环条件时停止循环。循环程序可以让代码更加简洁。

1. while循环

表现形式如下:

cpp
while(表达式) {
  语句块;
}

其中“表达式”一般指的是关系表达式或逻辑表达式,表示循环条件,值是一个逻辑真值或假值。

while循环的执行过程为:先计算“表达式”的值,当值为真时执行语句块,执行完语句块再次判断“表达式”的值,如果为真继续执行语句块,直到“表达式”的值为假值,才会结束循环。

小栗子: 计算1~100的累加和。

cpp
#include<iostream>
int main() {
    int i = 1;
    int sum = 0;
    while (i <= 100) {
        sum += i;
        ++i;
    }
std::cout << "结果为:" << sum << std::endl;
    return 0;
}

小栗子: 生物上学习的单细胞分裂,每一代细胞数量都会成倍数增长。一代只有一个细胞,二代有2个细胞,三代有四个细胞,请根据输入的代数输出该代数下的细胞数量

cpp
#include <iostream>
using namespace std;
int main() {
    int generation;
    cout << "请输入代数: ";
    cin >> generation;
    int cells = 1;  // 初始为第一代的细胞数量
    int currentGen = 1;
    while (currentGen < generation) {
        cells *= 2;
        currentGen++;
    }
    cout << "第" << generation << "代的细胞数量为: " << cells << endl;
    return 0;
}

不使用循环实现,高效率:

cpp
#include<iostream>
using namespace std;
int main() {
    int x; // 细胞代数
    int sum = 0; // 细胞总数
    cout << "请输入代数: ";
    std::cin >> x;
    sum += 1 << x - 1;
    std::cout << "第" << "x" << "代的细胞总数为:" << sum << std::endl;
    return 0;
}

2. do...while

表现形式如下:

cpp
do{
  语句块;
}while(表达式);

其中,do为关键字,必须与while配合使用;do和while之间的语句为循环体,同样用大括号括起来;“表达式”同样是关系表达式或逻辑表达式。do while与while循环的不同之处是:do while会先执行语句块,再判断表达式是否为真,如果为真继续循环,如果不为真则结束循环。因此,do while循环一定会执行一次循环体。

3. for循环

表现形式一般如下:

cpp
for(表达式1; 表达式2; 表达式3){
  循环体;
}

其中“表达式1”仅在第一次循环时执行,通常是一个赋值表达式,用来对循环变量进行初始化赋值;“表达式2”是一个关系表达式,称为循环条件,决定了是否还要继续下次循环;“表达式3”通常是一个带有自增或自减操作的表达式,使循环条件逐渐变的不成立。

小栗子: 1~100的累加和,使用for循环实现。

cpp
#include<iostream>
using namespace std;
int main() {
	int sum = 0;
	for (int i = 0; i <= 100; ++i) {
		sum += i;
	}
	cout << sum << endl;
	return 0;
}

注意事项:

变量一般声明在for循环语句之外,也可以直接在表达式1中声明变量,注意:在括号里面声明的变量只能在循环体中访问到,循环之外是访问不到的。

cpp
#include<iostream>
using namespace std;
int main() {
    for (int i = 0, sum = 0; i <= 100; i++) {
        sum += i;
    }
    cout << sum << endl;  // 这里会报错!
    return 0;
}

for循环中的表达式1、表达式2、表达式3都可以省略,但分号必须保留。

cpp
#include<iostream>
using namespace std;
int main() {
    for (; ;) {
        cout << "Hello World!";
    }
    return 0;
}

省略所有表达式,那么这就是一个死循环。

省略表达式2,也就是省略了循环终止条件,循环也会变成死循环。

省略表达式3,需要在for循环体中加入修变量的语句。

省略表达式1和表达式3后,就变得跟while循环一样了。

4. 循环控制

循环控制包含两个方面,一是循环控制变量的变化方式,二是循环控制的跳转。循环控制的跳转需要用到break和continue关键字,这两条跳转语句的跳转效果不同,break是中断整个循环体,continue是跳出该循环体的本次执行。除此之外,goto语句也可以用来跳出循环。

4.1 循环控制变量

循环控制变量,就是循环过程中用来控制循环次数和循环条件的变量。它通常作为循环的计数器,用于追踪循环的进度和控制循环的终止条件。

cpp
#include<iostream>
using namespace std;
int main () {
    int sum = 0;
    for(int i = 10; i >= 1; i--) {
        sum += i;
    }
    cout << sum << endl;
    return 0;
}

程序中,在for循环的表达式1中声明变量i并初始化值为10;表达式2中限定循环控制变量是否大于等于1,如果小于1,就停止循环;表达式3使用循环控制变量由10~1递减变化,程序输出的结果是55。

4.2 break语句

break语句作用:跳出当前循环体,从而中断本次循环。

cpp
#include<iostream>
using namespace std;
int main() {
    int i, n, sum;
    sum = 0;
    cout << "请输入3个数字:";
    for(i = 1; i <= 3; ++i) {
        cout << "第" << i << "项:";
        cin >> n;
        if(n < 0) {
            break;
        }
        sum += n;
    }
    cout << "结果是:" << sum << endl;
    return 0;
}

程序中需要用户输入3个数,然后计算三个数的和,当输入的数为负数时,就退出整个for循环,停止累加。

提示

当存在嵌套循环时,break语句只会使程序流程跳出包含它的内层循环结构,即只能跳出一层循环。

4.3 continue语句

continue语句是对break语句的补充。continue不是立即跳出循环体,而是跳过本次循环,回到循环的条件判断部分,重新开始执行循环。在for语句中遇到continue后,首先执行循环的增量部分,然后进行条件判断,在while和do while循环中,continue控制语句直接跳转到条件判断部分。

4.4 goto语句(不推荐使用)

goto语句被称为无条件跳转语句,用于改变语句的执行顺序。 goto label

其中,标签是用户自定义的一个标识符。goto语句可将程序跳转到由label代码定义的标签处继续执行。

cpp
#include<iostream>
using namespace std;
int main() {
    int i = 0;
    int sum = 0;
    lable: i++;
    sum += i;
    if(i < 10) {
        goto lable;
    }
    cout << sum << endl;
    return 0;
}

示例中,通过goto语句标签实现了一定的循环功能。当语句执行到 if(i < 10) 时,如果条件成立,就跳转到label标签处,再一次执行循环变量i的自增运算和累加求和运算。

使用goto语句注意事项:

定义标签时,其后不能直接跟 “}”,会导致编译错误。

cpp
{
    lable:
}

goto语句不能跳过除复合语句之外的其他变量定义的语句。

cpp
goto label:
int i = 10;
label: cout << "goto" << endl;

警告

goto语句是一种古老的语法,会使程序执行顺序变的错乱,CPU执行效率也较低。因此实际开发中要尽量避免使用goto。

5. 循环嵌套

for、while、do while循环之间可以相互嵌套:

cpp
for(; ;) {
    while () {

    }
}

小栗子: 输出九九乘法表。

cpp
#include<iostream>
using namespace std;
int main() {
    for (int i = 1; i <= 9; ++i) {
        for (int j = 1; j <= i; ++j) {
            cout << j << " x " << i << " = " << i * j << ' ';
        }
        cout << endl;
    }
    return 0;
}

💬 欢迎评论!请确保您已登录 GitHub。