C++菜鸟学习笔记系列(15)
本期主题:迭代语句(包括while语句、传统for语句、范围for语句、do…while语句)
迭代语句就是我们常说的循环,它重复执行一些操作直到满足某个条件才停下来。不同的是while语句和for语句都是在执行循环体之前先进行条件的检查,而do…while语句则是在执行了循环体之后才会进行条件检查(也就是说,无论初始条件是否满足,do…while语句肯定会执行一次循环体操作,而while语句和for语句则一次都不执行)。
下面我们就来分别讨论一下这最常见的几种迭代语句:
(1)while语句
while语句的基本形式为:
while (条件) { 循环体; }
while的条件部分可以是一个表达式或者是一个带初始化的变量声明。一般来说我们通过循环体来改变表达式的值,当然有些时候我们也可以通过条件本身来改变表达的值,但是表达式的值一定要可以通过改变最终满足条件,否则会导致循环不能终止。
当我们不知道具体要迭代多少次时,使用while循环是一个不错的选择,比如读取输入的内容就是这样,我们在写程序时,并不知道使用者要输入多少个字符对吧。除此之外,还有一种情况也常用while语句,就是我们想要在循环结束后访问控制循环的变量。
下面我们来看一个小例子:
/* author: wxc_1998 date: 2018/10/22 */ #include <iostream> #include <vector> using namespace std; void main() { int i; vector <int> vec ; cout << "please input a integer:" << endl; while(cin >> i) vec.push_back( i ); auto b = vec.begin(), e = vec.end(); while(b != e && *b >= 0 ) ++ b; if(b == e ) cout << "all of they are positive integers! " << endl; else cout << *b << " is the first number that isn't a positive integer!" << endl; cout << endl << "press any key to continue!"; cin.clear(); cin.sync(); cin.get(); }
可以看到,在上述代码中我们使用了两个while语句,这两个语句中分别代表了我们开始时所说的两种情况,第一种我们一直在输入整数,但是我们并不知道要输入多少个整数,所以我们使用了一个vector容器去存储,使用了while语句去循环;第二种,我们在后面还要使用变量b判断是否到达了vector变量vec的尾部,所以使用while语句(关于迭代器的有关知识请点击“迭代器”)。
(2)传统for语句
我们在其他的一系列语言中都可以发现for语句的基本形式为:
for ( 初始化变量; 控制条件; 变量变化 ) { 循环体; }
对于传统for语句头中的三个部分原则上都可以省略不写,这三个部分在省略时有以下几个注意点:
(1)省略初始化变量:初始化变量这个部分可以是声明语句(最常见)、表达式(在前面已经声明变量)、空语句(后面控制条件及循环体中所用到的变量已经在前面声明)这三个情况,对于最后一中情况我们只要在前面有相应变量的声明和初始化就可以用一个空语句代替这一部分了。
(2)省略控制条件:可能很多同学会认为省略初始化变量也就算了,控制条件怎么可以省略呢?这样不是就进入了一个死循环了吗?对,如果我们省略了控制条件之后不做其他补充那么肯定就是一个逻辑上错误的死循环,但是我们如果在循环体中加入一个控制条件不就可以解决这个问题了吗?
例如:
if ( 变量满足条件 ) break;
(3)省略变量变化:这一部分和第二部分类似的,如果我们去除之后不做其他改变会导致变成一个死循环,但是我们在去除它之后,只要在循环体中改变变量的值就可以实现同样的效果。
对于传统for语句我就不做过多介绍了,还有一个必须要记住的是在for语句头及其循环体中定义的变量都不可以在外部使用。
(3)范围for语句
C++11新标准为我们提供了一种更加简单的for语句(至少是从形式上更加简略),这种for语句可以遍历容器或者其他序列中的所有元素。其基本形式为:
for(定义变量(容器或序列中的元素类型):容器或序列) { 循环体; }
在第一部分我们定义变量时,如果不知道容器或序列内部元素的类型,那么使用auto关键字可能是一个比较好的解决方式。容器或序列是指我们在之前所介绍的string类型、vector类型、数组类型等。
范围for语句的工作方式是在每一次迭代都会重新定义循环控制变量,并将其初始化为容器或序列中的下一个值,然后执行循环体,直到容器或序列中的所有元素都处理完毕后为止,这样也就实现了对容器或序列的遍历操作。
我们来看一个关于范围for语句使用的小例子:
/* author: wxc_1998 date: 2018/10/22 */ #include <iostream> #include <string> using namespace std; void main() { string s = "hello world!"; for(auto c : s) { cout << c << " "; } cout << endl << "press any key to continue!"; cin.clear(); cin.sync(); cin.get(); }
对于上述代码我们实现了把hello world!各字符之间加入了一个“ ”。
上述代码中的范围for语句其实还可以用以下所示的传统for语句所代替:
for (auto b = s.begin() , e = s.end(); b != e ; ++ b) { cout << *b << " "; }
从形式上看范围for语句确实简单不少,对于遍历容器或序列中的元素十分方便!
(4)do while语句
do while语句和我们在前面所介绍的while语句十分相似,唯一的区别就是do while语句会先执行循环体然后再进行判断条件,其基本形式为:
do { 循环体; } while(控制条件);
注意:这里的while后面还有一个分号“;”,我们在使用时不要忘记加了。
下面我们来看一个小例子:
/* author: wxc_1998 date: 2018/10/22 */ #include <iostream> using namespace std; void main() { char c; do { cout << "please inpute two numbers:" << endl; double i = 0, j = 0; cin >> i >> j; cout << i << " + " << j << " = " << i+j << endl; cout << "calculate more?(Enter y or n)" << endl; cin >> c; } while (c == 'y'); cout << endl << "press any key to continue!"; cin.clear(); cin.sync(); cin.get(); }
上述代码至少会进行一次运算,且可以根据用户的后续输入字符来决定是否继续执行循环,从而实现多次运算或停止。
好了,关于迭代语句我们就介绍到这里了。
注:虽然这篇博客的内容十分简单,但是大家若有转载还请标明出处!