循环语句
while
while
的具体语法如下图所示
while
语句的处理逻辑分为以下三步:
- 判断条件是否满足,如果不满足则跳出循环
- 如果条件满足则执行循环体
- 执行完循环体后转向步骤1
int x =3;
while(x){
std::cout << x << std::endl;
--x;
}
注意,在
while
条件部分不包含额外的初始化内容
do-while
do-while
的具体语法如下图所示
注意
do-while
结尾处要有分号,表示一条语句的结束
do-while
语句的处理逻辑如下:
- 执行循环体
- 判断条件是否满足,如果不满足则跳出循环
- 如果条件满足则转向步骤1
int x =3;
do{
std::cout << x << std::endl;
--x;
}while(x);
注意
do-while
不管条件是否满足都会先执行一次循环体
注意
do-while
语句的条件部分不能包含变量初始化生命
for
for
的具体语法如下图所示
for
语句的处理逻辑如下:
- 初始化语句会被首先执行
- 条件部分会被执行,执行的结果如果为
false
,则终止循环 - 执行的结果如果为
true
,则执行循环体 - 迭代表达式会被求值,之后转向步骤2
for(int x = 0; x < 5; ++x){
std::cout << x << std::endl;
}
关于for
语句,我们需要注意以下几点:
- 在初始化语句中可以声明多个名字,但是他们的基础类型一定要相同
for (int i = 0, *p = &i; i < 9; i += 2) { std::cout << i << ':' << *p << ' '; } std::cout << '\n';
- 初始化语句、条件、迭代表达式可以为空
注意若条件部分为空,则默认按
true
处理
关于for
的更多示例请参考这里
基于范围的for
基于范围的for
的具体语法如下图所示
std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (const int& i : v) // 以 const 引用访问
std::cout << i << ' ';
std::cout << '\n';
基于范围的
for
本质上是一个语法糖,编译器会将它转换为普通的for
的调用方式
关于基于范围的for
的具体转换形式的演变如下图所示
使用基于范围的for
时通常我们会使用常量左值(const auto &
)引用来读元素,使用“万能引用”(auto &&
)来修改元素
break/continue关键字
最后我们来看一下循环语句中最常用的两个关键字
break
:导致外围的for
、基于范围的for
、while
、do-while
或switch
语句终止for (int j = 0; j < 2; j++) { for (int k = 0; k < 5; k++) { //只有此循环会受到 break 的影响 if (k == 2) break; std::cout << j << k << " "; } }
continue
:用于跳过整个for
、基于范围的for
、while
或do-while
循环体的剩余部分for (int j = 0; j < 2; j++) { for (int k = 0; k < 5; k++) { // 仅此循环受 continue 影响 if (k == 3) continue; std::cout << j << k << " "; // 此语句在每次 k==3 时跳过 } }
注意
break
和continue
均不能作用于多重嵌套循环的相对于break/continue
的外层,多重嵌套循环的任意跳转可考虑goto
语句