【C++基础】第三十一课:迭代语句

while语句,传统的for语句,范围for语句,do while语句

Posted by x-jeff on October 27, 2021

【C++基础】系列博客为参考《C++ Primer中文版(第5版)》C++11标准)一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.迭代语句

迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来。while和for语句在执行循环体之前检查条件,do while语句先执行循环体,然后再检查条件。

2.while语句

语法形式:

1
2
while (condition)
	statement

在while结构中,只要condition的求值结果为真就一直执行statement(常常是一个块)。condition不能为空,如果condition第一次求值就得false,statement一次都不执行。

3.传统的for语句

for语句的语法形式是:

1
2
for (init-statement;condition;expression)
	statement

关键字for及括号里的部分称为for语句头。init-statement必须是以下三种形式中的一种:声明语句、表达式语句或者空语句

一般情况下,init-statement负责初始化一个值(只在循环开始时执行一次),这个值将随着循环的进行而改变。condition作为循环控制的条件,只要condition为真,就执行一次statement。如果condition第一次的求值结果就是false,则statement一次也不会执行。expression负责修改init-statement初始化的变量,这个变量正好就是condition检查的对象,修改发生在每次循环迭代之后

1
2
3
4
5
6
7
int val;
val = 0;
for (; val < 5; val++) {
    val = 3;
    break;
}
cout << val << endl;//3

👉和其他的声明一样,init-statement也可以定义多个对象。但是init-statement只能有一条声明语句,因此,所有变量的基础类型必须相同

1
2
for (decltype(v.size()) i=0,sz=v.size();i!=sz;++i)
	v.push_back(v[i]);

👉for语句头能省略掉init-statement、condition和expression中的任何一个(或者全部)。例如:

1
2
3
vector<int> v;
for (int i; cin >> i ; /*表达式为空*/)
	v.push_back(i);

4.范围for语句

C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素。范围for语句(range for statement)的语法形式是:

1
2
for (declaration : expression)
	statement

expression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或者vectorstring等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin和end成员。

declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符,这个关键字可以令编译器帮助我们指定合适的类型。如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。举个例子:

1
2
3
4
//把vector对象中的每个元素都翻倍
vector<int> v={0,1,2,3,4,5,6,7,8,9};
for (auto &r : v)
	r *= 2;

5.do while语句

do while语句(do while statement)和while语句的唯一区别是:do while语句先执行循环体后检查条件。

1
2
3
do
	statement
while (condition);//注意此处的分号

❗️condition不能为空,且使用的变量必须定义在循环体之外。因为对于do while来说先执行语句或者块,后判断条件,所以不允许在条件部分定义变量:

1
2
3
4
do{
	//......
	mumble(foo);
} while (int foo = get_foo());//错误:将变量声明放在了do的条件部分