您现在的位置是:首页 >技术教程 >C/C++中for循环详解,以及括号中三部分内容的含义和C++11标准for方法网站首页技术教程
C/C++中for循环详解,以及括号中三部分内容的含义和C++11标准for方法
for循环语句
作用: 满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体) { 循环语句; }
格式:
for(init-statement;condition;expression){
statement
}
解析:
init-statement: 可以为三种形式:声明语句、表达式语句或者空语句。这决定了init-statement会是一个复杂的语句。
condition: 为循环语句控制条件,当为False,则statement一次不会执行。
expression: 负责修改init-statement初始化变量,修改发生在每次修改迭代之后。
Tip
:for上述格式的三个参数都可以被省略掉。第一个参数省略和最后一个参数省略都好理解。中间参数condition如果没有,则会默认表示为True,但是退出循环需要内部有语句负责退出循环。下述我会使用init-statement、condition和expression指代对应的部分。
执行顺序:
问题1:是否for循环中init-statement、condition和expression所处理的参数不同,能否运行
#include <iostream>
using namespace std;
int main(){
int i,j=5,k=0;
for(i=10;j<10;k++){
cout<<"k"<<k<<endl;
}
}
上述代码会一直循环下去,通过此代码,我们可以判断出for( ; ; )中的三部分并没有联系,可以是任何不相关内容,判断依靠中间j<10。
问题2:for循环中init-statement、condition和expression中内容都为空,能否运行
#include <iostream>
using namespace std;
int main(){
int i,j=5,k=0;
for(;;){
cout<<"k"<<k++<<endl;
}
}
实验证明依然可以运行,默认为True,等同于while(true){…},会一直执行k++操作。
问题3:for循环中expression中i++和++i会有区别吗?
for(i=0;i<5;++i){
cout<<"++i:"<<i<<endl;
}
for (i = 0; i < 5; i++)
{
cout << "i++:" << i << endl;
}
输出>>>
++i:0
++i:1
++i:2
++i:3
++i:4
i++:0
i++:1
i++:2
i++:3
i++:4
添加上述代码块得出结果没有差别,因为expression修改发生在每次修改迭代之后。
C++11for循环方法
C++11 for称为基于范围(ranger-based)的for循环,简化了常见循环任务,对应数组(或容器类,如vector和array)的每个元素执行相同的操作。
格式:
for (declaration : expression)
statement
expression必须是一个序列。
declaration定义一个变量,每次会从expression中顺序取值,并且可以将序列中的值转换为declaration中定义的类型的值,如下例。
实例:
#include <iostream>
using namespace std;
int main(){
double prices[5]={4.1,5.2,6.3,7.4,8.5};
for (int x:prices){
cout<<x<<endl;
}
}
output>>>
4
5
6
7
8
x会顺序从prices中获取元素,从左往右顺序读取,有点类似于python中for … in … 用法。相对于原始for循环,无法定义循环范围会全部循环,这也就要求了expression必须是一个序列,比如初始值列表,数组等。
总结:
- for本身也是一个函数。也就是说如果定义for(int i=0;i<10;i++){ …}其中定义的i不能在for循环以外被调用。因为本身是一个函数,在其中定义的变量为局部变量,在函数运行结束后,会被销毁释放空间。
- i++和++i虽然各自运算方式,前者先执行语句后执行i=i+1;后者先加执行i=i+1后执行语句。但是在for循环中由于expression块是在每次修改迭代之后执行,所以无影响。
- 在需要便利数组元素时c++11的for循环显然是便利的,但对于大多数局部内容循环,就会显得有些多余。
警告C6294:未定义 for-loop:初始条件不满足测试。 循环体未执行。
出现此问题官方文档给出的答案是此警告指示无法执行 for-loop,因为终止条件为 true。 此警告表明程序员的意图未正确捕获。
int arr[5] = { 300,350,200,400,250 };
//错误情况
for (int j = 4; j <= 3; cout << arr[j--] << " ");//报C6294错误
//正确情况1
for (int j = 4; j >= 1; cout << arr[j--] << " ");//无问题
//正确情况2
int j = 4;
for (j; j <= 1; cout << arr[j--] << " ") ;
上述是一个看起来比较复杂的for循环,使用了三步的知识:j - -
,cout
,int j = 4
。
上面已经说过了for循环括号的init-statement和expression部分理论上可以是任何语句,所以我直接在里面写写了输出cout语句。上述会先执行cout输出,后执行j–。回归正题,上述报错会提示未执行循环正文,实际上是由于定义的局部变量和内部首次判断产生了冲突,定义j=4,但是首次判断j<=3。情况2将j int定义在外部就不会出此错误。
本片文章参考C++ primer(第5版),C++ primer plus(第6版)和黑马程序员视频,如有错误,希望批评指正!!!