启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
之前的编程过程当中,或多或少的使用过C++的循环语句,但是没有仔细的聊过,那么今天来深入聊聊C++的循环,当然,伴随着循环需要有一个循环的控制部分,也就是跳转语句。
for循环
在编程的过程当中,经常会遇到重复的情况,比如,展示vector当中的每个元素,比如输出10次hello word,这样的需求确实可以使用代码复制来完成,但是,考虑的代码的维护成本(也就是可维护性),使用循环来代替这样有规律的复制会比较好,那么就有了循环,而for循环就是其中的一种:
#include <iostream>
#include <string>
using namespace std;
int main(){
string hello = "hello word";
int size = hello.size();
for(int i; i < size; i++){
cout << hello[i] << endl;
}
return 0;
}
for循环的语句部分分为三个部分,声明语句,循环控制条件,表达式语句,其中:
声明语句代表的是循环需要的一个变量,比如上面案例当中的i;
循环控制条件是声明变量的变化范围,比如上面案例当中的i<size;
表达式是用来说明声明语句变量的变化情况,比如上面案例当中的i++;
所以上面的循环可以完整的描述成:声明一个变量i,在i小于size的前提先,自增,每次循环自增1,也可以描述为没执行一次循环,i自增1,所以在语句当中就可以直接使用i或为hello字符串的下标去取hello的元素了。
常规的for循环就是如此,但是也有要注意的地方:
1、当然,这里使用到了循环声明的变量i,实际上不适用i也是可以的,比如,就是想让代码重复执行10次,那么就可以直接在语句块当中填入要循环的语句,不需要调用循环声明的变量。
2、for循环比较适合已经知道循环次数的循环。
3、for循环语句部分的三个条件是可以省略或者写在其他部分的,不一定都写在括号里面,比如:
#include <iostream>
#include <string>
using namespace std;
int main(){
string hello = "hello word";
int size = hello.size();
for(int i; i < size;){
cout << hello[i] << endl;
i++;
}
return 0;
}
4、for循环语句当中可以定义定义多个变量,但是只能由一个表达式,所以变量的类型是需要一致的。
.....
for(int i,j; i < size;){
cout << hello[i] << endl;
i++;
}
.....
while循环
循环的过程当中,有时候是基于某个对象进行循环,那么系统是知道循环的次数的,比如上面循环展示一个字符串的元素,但是也有可能是不知道循环次数的,比如,判断一个文件目录的深度(从根目录到达只有文件,没有目录的次数),那么这个时候就没有一个具体的循环次数了,可能是1次也有可能是10次,所以这个时候就需要基于条件的判断了,while就可以出现了。
#include <iostream>
using namespace std;
int main(){
int num = 0;
while(num < 10){
cout << num << endl;
++num;
}
return 0;
}
相比较for循环while循环的写法更加简单,只有一个条件,如果条件满足(为真)就循环一次,然后再次判断,知道条件为假停止执行。
do while循环
在while的基础上,c++退出了do while语句,所谓的do while和while的区别是,先执行,再判断,而while语句是先判断,再执行,也就是说do while语句至少会执行1次,格式如下:
#include <iostream>
#include <string>
using namespace std;
int main(){
int num = 0;
do{
cout << num << endl;
num++;
}while(num < 10);
return 0;
}
同样,这里有一个点需要注意,就是do while语句是先执行do,再进行while当中的条件判断,所以如果声明变量的话,需要再do当中进行或者外部进行,放到while当中声明变量,然后do当中调用是会报错的。
跳转语句
上面说了很多的循环语句,但是在循环的过程当中是没有办法控制的,这个其实是一个很大的问题,比如从一个数组当中查找一个字符,如果找到就停止查找,不再像后面查找了,那么这个需求当中,如果不能在循环的过程当召控制循环的话就不太好实现了,c++通过跳转语句实现了对循环的控制。c++提供了4种跳转语句:
break
break 语句可终止执行最近的封闭循环或其所在条件语句。其实通俗的来说就是跳出上一层控制,最常见的就是在我们之前聊过的switch语句当中,当然在for和while语句当中也是可以使用的:
.....
for(int i = 1; i < 10; i++){
if(i%2 == 0){
break
}
cont << "hello" << endl;
}
.....
这里当i取余2为0的时候(偶数),整个循环就会被break终止。
continue
相比较break语句,continue跳出的范围比较小,只是正对当次循环,比如上面的案例:
.....
for(int i = 1; i < 10; i++){
if(i%2 == 0){
continue
}
cont << "hello" << endl;
}
.....
这里当i取余2为0的时候(偶数),整个循环不会停止,但是取余2的这次会停止,下面的输出hello就不会执行了,但是下次循环接着执行。
goto 与 return
这两个都和函数有关系,在循环当中使用并不多。我们聊函数的时候再具体聊,这里不做深入讲解。
循环嵌套
最后还是要聊聊嵌套,其实不论是判断还是循环,在工作场景下一般很难单独使用,通常会结合嵌套使用,这里就涉及到了一个执行顺序的问题,对于嵌套循环来说,一个关键的规律一定要把握好:外层循环执行一次,内层循环执行一遍,如果再复杂的话,就要关注内外层循环的变量的变化了,比如:
.....
for(int i = 1; i < 10; i++){
for(var j = 1; j < i;j++){
count << j << endl;
}
cont << i << endl;
}
.....
那么在这里就是外层i=1的时候,j会循环一遍就是10次,j分别等于 1,2,3,4,5,6,7,8,9然后i = 2,再来一次,所以一个尝试就是,嵌套循环的时间复杂度至少是n方,这个捋清楚,然后再多写几个案例,嵌套循环的理解就没有问题了。
关于C++的循环和跳转语句就先聊这么多,还是请各位大佬多多指点。