迭代语句

while 语句

当条件为真时,while 语句反复执行目标语句。它的语法形式如下:

while (condition)
statement

只要条件 condition 的值为 true,执行语句 statement(通常是一个块语句)。condition 不能为空。如果第一次求解 condition 就产生 false 值,则不执行 statement。

在循环条件中定义的任意变量都只在与 while 关联的块语句中可见。每一次循环都将该变量的初值转换为 bool。 如果求得的值为 true,则执行 while 的循环体。通常,循环条件自身或者在循环体内必须做一些相关操作来改变循环条件表达式的值。否则,循环可能永远不会结束。

在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。

for 循环语句

for 语句的语法形式是:

for (init-statement condition; expression)
statement

init-statement 必须是声明语句、表达式语句或空语句。这些语句都以分号结束,因此其语法形式也可以看成:

for (initializer; condition; expression)
statement

当然,从技术上说,在 initializer 后面的分号是 for 语句头的一部分。

一般来说,init-statement 用于对每次循环过程中都要修改的变量进行初始化, 或者赋给一个起始值。 而 condition 则是用来控制循环的。当 condition为 true 时, 循环执行 statement。如果第一次求解 condition 就得 false 值,则不执行 statement。expression 通常用于修改在 init-statement 中初始化并在 condition 中检查的变量。它在每次循环迭代后都要求解。如果第一次求解 condition 就得 false 值, 则始终不执行 expression。 通常, statement 既可以是单个语句也可以是复合语句。

for 循环的使用

假设有下面的 for 循环,用于输出一个 vector 对象的内容:

for (vector<string>::size_type ind = 0;
ind != svec.size(); ++ind) {
cout << svec[ind]; // print current element
// if not the last element, print a space to separate from the
next one
if (ind + 1 != svec.size())
cout << " ";
}

它的计算顺序如下:

1. 循环开始时, 执行一次 init-statement。 在这个例子中, 定义了 ind, 并将它初始化为 0。

2. 接着,求解 condition。如果 ind 不等于 svec.size(),则执行 for 循环体。否则,循环结束。如果在第一次循环时,条件就为 flase,则不执行 for 循环体。

3. 如果条件为 true,则执行 for 循环体。本例中, for 循环体输出当前元素值,并检验这个元素是否是最后一个。如果不是,则输出一个空格,用于分隔当前元素和下一个元素。

4. 最后,求解 expression。本例中,ind 自增 1。

应该谨记:在 for 语句头定义的任何对象只限制在 for 循环体里可见。因此,对本例而言,在执行完 for 语句后,ind 不再有效。

省略 for 语句头的某些部分

for 语句头中, 可以省略 init-statement、 condition 或者 expression(表达式)中的任何一个(或全部)。

如果不需要初始化或者初始化已经在别处实现了,则可以省略init-statement。例如, 使用迭代器代替下标重写输出 vector 对象内容的程序,为了提高易读性,可将初始化移到循环外面:

vector<string>::iterator iter = svec.begin();
for( /* null */ ; iter != svec.end(); ++iter) {
cout << *iter; // print current element
// if not the last element, print a space to separate from the
next one
if (iter+1 != svec.end())
cout << " ";
}

注意此时必须要有一个分号表明活力了 init-statement——更准确地说,分号代表一个空的 init-statement。

省略 condition,则等效于循环条件永远为 true:

for (int i = 0; /* no condition */ ; ++i)

相当于程序写为:

for (int i = 0; true ; ++i)

这么一来,循环体内就必须包含一个 break 或者 return 语句。否则,循环会一直执行直到耗尽系统的资源为止。同样地,如果省略 expression,则必须利用 break 或 return 语句跳出循环,或者在循环体内安排语句修改condition 所检查的变量值。

for (int i = 0; i != 10; /* no expression */ ) {
// body must change i or the loop won't terminate
}

for 语句头中的多个定义

可以在 for 语句的 init-statement 中定义多个对象;但是不管怎么样,该处只能出现一个语句,因此所有的对象必须具有相同的一般类型:

const int size = 42;
int val = 0, ia[size];
// declare 3 variables local to the for loop:
// ival is an int, pi a pointer to int, and ri a reference to int
for (int ival = 0, *pi = ia, &ri = val;
ival != size;
++ival, ++pi, ++ri)
// ...

范围for语句

C++11新标准提供的范围for语句.这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作,其语法形式是:

for(declaration : expression)
      statement

其中,expression 部分是一个对象,用于表示一个序列。declaration 部分负责定义一个变量,该变量将用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。

vector<int> v={0,1,2,3,4,5,6,7};

//若想改变容器内元素的值,范围变量必须是**引用**类型

for (auto &r : v )  //对v中的每个元素
    r*=2;           //将v中的每个原素的值翻倍

for语句声明了循环控制变量r,并把它和v关联在一起,使用关键字auto令编译器为r指定正确的类型,由于准备修改v的元素值,所以需要将r声明成引用类型。

采用旧的for循环实现:

for (auto beg=v.begin(),end=v.end(); beg!=end; ++beg)
{
        auto &r=*beg;
        r*=2;
}

do while 语句

do while 循环正好满足这样的需要。它保证循环体至少执行一次。

do
statement
while (condition);

与 while 语句不同。do-while 语句总是以分号结束。

在求解 condition 之前,先执行了 do 里面的 statement。condition 不能为空。如果 condition 的值为假,则循环结束,否则循环重复执行。

// repeatedly ask user for pair of numbers to sum string rsp;
// used in the condition; can't be defined inside the do
do {
cout << "please enter two values: ";
int val1, val2;
cin >> val1 >> val2;
cout << "The sum of " << val1 << " and " << val2
<< " = " << val1 + val2 << "\n\n"
<< "More? [yes][no] ";
cin >> rsp;
} while (!rsp.empty() && rsp[0] != 'n');

此代码把 rsp 定义在 do 之前而不是在循环体内部。如果把 rsp 定义在 do 内部,那么 rsp 的作用域就被限制在 while 前的右花括号之前了。任何在循环条件中引用变量都必须在 do 语句之前就已经存在。

因为要到循环语句或者语句块执行之后, 才求解循环条件, 因此 do while 循环不可以采用如下方式定义变量:

// error: declaration statement within do condition is not supported
do {
// ...
mumble(foo);
} while (int foo = get_foo()); // error: declaration in do condition 
posted @ 2018-04-30 10:20  刘-皇叔  阅读(653)  评论(0)    收藏  举报