5.4 迭代语句
while
和for
语句在执行循环体之前检查条件,do while
语句先执行循环体,然后再检查条件。
5.4.1 while 语句
只要条件为真,while 语句就重复的执行循环体,它的语法形式如下:
while (conditon)
statement
在 while 结构中,只要 condition 的求值结果为真就一直执行 statement。 condition 不能为空,如果 condition 第一次求值就得 false,statement 一次都不执行。
定义在 while 条件部分或者 while 循环体内的变量每次迭代都经历从创建到销毁的过程。
使用 while 循环
当不确定到底要迭代多少次时,使用 while 循环比较合适。想在循环结束后访问循环控制变量也应该使用 while.
vector<int> v;
int i;
while (cin >> i)
v.push_back(i);
// 寻找第一个负值元素
auto beg = v.begin();
while (beg != v.end() && *beg > 0)
++beg;
if (beg == v.end())
// 此时我们直到 v 中的所有元素都大于等于 0
5.4.2 传统的 for 语句
for 语句的语法形式是:
for (init-statement; condition; expreesion)
statement;
init-statement
负责初始化一个值,必须是以下三种形式中的一种:声明语句、表达式语句或者空语句。
condition
控制循环的条件,
expression
负责修改init-statement
初始化的变量。
传统 for 循环的执行流程
for 语句头中定义的对象只在 for 循环体可见。
for 语句头中多重定义
init-statement
可以定义多个对象,但是只能有一条声明语句,因此所有变量的基础类型必须相同
// 记录下 v 的大小,当到达原来的最后一个元素后结束循环
for (decltype(v.size()) i = 0, sz = v.size();
i != sz; ++i)
v.push_back(v[i]);
省略 for 语句头的某些部分
for 语句头能省略掉init-statement
、condition
和expression
中的任何一个(或者全部)。
如果无需初始化,则我们可使用一条空语句作为init-statement
。
省略condition
的效果等价于在条件部分写了一个 true。因为条件的值永远是 true,所以在循环体内必须有语句负责退出循环,否则循环就会无休止地执行下去。
省略expression
要求条件部分或者循环体必须改变迭代变量的值。
5.4.3 范围 for 语句
范围 for 语句可以遍历容器或其他序列的所有元素。语法形式如下:
for (declaration : expression)
statement;
expression
表示的必须是一个序列,比如用花括号括起来的初始值列表或者vector
或string
等类型的对象,这些对象的共同特点是拥有能返回迭代器的begin
和end
成员。
declaration
定义一个变量,序列中的每个元素都得能转换成该变量的类型。
5.4.4 do while 语句
do while 语句先执行循环体后检查条件。语法形式如下:
do
statement
while (condition);
注意:condition
使用的变量必须定义在循环体之外。