文章目录
- while语句
- 使用while循环
- 传统for语句
- 传统for循环的执行过程
- for语句头中的多重定义
- 省略for语句头的某些部分
- 范围for语句
- do while语句
迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来。while和for语句在执行循环体之前检查条件,do while 语句先执行循环体,然后再检查条件。
while语句
基本语法:
while(condition)
statement
在while结构中,只要condition的求值结果为真就一直执行statement (常常是一一个块)。condition不能为空,如果condition第一次求值就得 false, statement 一次都不执行。while的条件部分可以是一个表达式或者是一个带初始化的变量声明。通常来说,应该由条件本身或者是循环体设法改变表达式的值,否则循环可能无法终止。
PS:定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程。
使用while循环
当不确定到底要迭代多少次时,使用while循环比较合适,比如读取输入的内容就是如此。还有一种情况也应该使用while循环,这就是我们想在循环结束后访问循环控制变量。
样例:下面将演示使用循环内变量以及利用while无限输入数据的操作。(此段程序所做的就是统计连续出现的字符串次数,并输出最大的)
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string> str;
string p;
int num1=1, num2=1;
while (cin>>p)
{
str.push_back(p);
}
auto pbeg = str.begin();
p = *pbeg;
while (++pbeg!=str.end())
{
if (*pbeg==*(pbeg-1))
{
num2 += 1;
}
else
{
num2 = 1;
}
if (num2>=num1)
{
p = *pbeg;
num1 = num2;
}
}
if (num1>1)
{
cout << p << "连续出现了" << num1 << "次" << endl;
}
else
{
cout << "没有连续出现的字符串" << endl;
}
return 0;
}
输出结果:
传统for语句
传统for循环的语法是:
for(ini-statement;condition;expression)
statement
一般情况下,init-statement负责初始化一个值,这个值将随着循环的进行而改变。condition作为循环控制的条件,只要condition 为真,就执行一次 statement。如果condition第一次的求值结果就是false, 则statement 一次也不会执行。expression 负责修改init-statement初始化的变量,这个变量正好就是condition检查的对象,修改发生在每次循环迭代之后。statement 可以是一条单独的语句也可以是一条复合语句。
传统for循环的执行过程
这里用一个以前常用的例子(小写字母改成大写字母为例):
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string str = "helloworld";
for (decltype(str.size()) i = 0; i != str.size() && !isspace(str[i]); i++)
str[i] = toupper(str[i]);
cout << str;
return 0;
}
求值的顺序如下所示:
- 循环开始时,首先执行一 次init-statement。 此例中,定义i并初始化为0。
- 接下来判断condition。如果i不等于str.size()而且在str[i]位置的字符不是空白,则执行for循环体的内容。否则,循环终止。如果第一次迭代时条件就为假,for 循环体一次也不会执行。
- 如果条件为真,执行循环体。此例中,for 循环体将str [i]位置的字符改写成大写形式。
- 最后执行expression。此例中,将i的值加1。
这4步说明了for循环第一次迭代的过程。其中第1步只在循环开始时执行一次,第2、3、4步重复执行直到条件为假时终止,也就是在str中遇到一一个空白字符或者i 大于str.size()时终止。
PS:值得注意的是,for语句头定义的变量的生存周期仅在for循环内部可见,出了for循环后,除非是定义在外部的变量,进入for循环进行改变,生存周期才在外面。
for语句头中的多重定义
和其他的声明一样,init-statement 也可以定义多个对象。但是init-statement只能有一条声明语句,因此,所有变量的基础类型必须相同。即在ini-statement当中仅能int i=0,j=0.不能存在完整的语句,不然就需要分号。
省略for语句头的某些部分
for语句头能省略掉init-statement、condition和expression中的任何一个(或者全部)。如果无须初始化,则我们可以使用一条空语句作为init-statement。但是分号必须保留,以证明我们省略了,而非忘记填了。
省略condition的效果等价于在条件部分写了一个true.因为条件的值永远是true,所以在循环体内必须有语句负责退出循环,否则循环就会无休止地执行下去。
我们也能省略掉for语句头中的expression,但是在这样的循环中就要求条件部分或者循环体必须改变迭代变量的值。这样子才能跳出循环。
最后以一段代码进行收尾,大家理解一下这段代码。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>num1 = { 0,1,1,2 };
vector<int>num2 = { 0,1,1,2,3,5,8 };
//题目我们要判断num1和num2之间是否有一个是另一个的前缀。
bool tag = true;
for (decltype(num1.size()) beg1 = 0,beg2= 0; beg1 != num1.size() && beg2 != num2.size() ; beg1++,beg2++)
{
if (num1[beg1]!=num2[beg2])
{
tag = false;
break;
}
}
if (tag)
{
cout << "是" << endl;
}
else
{
cout << "不是" << endl;
}
return 0;
}
输出结果:
范围for语句
C++11中引入了一个新的for循环,范围for来遍历容器或者其他的序列的所有元素。
语法:
for(declaration : expression)
statement
expression表示的必须是一个序列,比如用花括号括起来的初始值列表 、数组或者vector或string等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin和end成员。
declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符,这个关键字可以令编译器帮助我们指定合适的类型。如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。
每次迭代都会重新定义循环控制变量,并将其初始化成序列中的下一个值,之后才会执行statement。像往常一样, statement 可以是一条单独的语句也可以是一一个块。所有元素都处理完毕后循环终止。
这边给一个例子:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> num1 = { 0,1,2,3,4,5 };
for (auto& i:num1 )
{
i *= 2;
}
for (auto i:num1)
{
cout << i << " ";
}
return 0;
}
输出结果:
do while语句
do while语句和while语句非常相似,唯一的区别 是,do while语句先执行循环体后检查条件。不管条件的值如何,都至少执行一次循环。do while语句的语法形式如下所示:
do
statement
while(condition);
PS:do-while语句应该在最后面的括号处加上一个分号。
但值得注意的是,它和while最大的区别就是他会先不管condition,会先执行一次。所以,我们平时可能会在while当中定义变量,或者接收cin的输入流,对于do-while就明显使用不了了,除非你想使用进行特殊的功能。