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必须是一个序列,比如初始值列表,数组等。

总结:

  1. for本身也是一个函数。也就是说如果定义for(int i=0;i<10;i++){ …}其中定义的i不能在for循环以外被调用。因为本身是一个函数,在其中定义的变量为局部变量,在函数运行结束后,会被销毁释放空间。
  2. i++和++i虽然各自运算方式,前者先执行语句后执行i=i+1;后者先加执行i=i+1后执行语句。但是在for循环中由于expression块是在每次修改迭代之后执行,所以无影响。
  3. 在需要便利数组元素时c++11的for循环显然是便利的,但对于大多数局部内容循环,就会显得有些多余。
  4. 警告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 - -coutint j = 4
上面已经说过了for循环括号的init-statement和expression部分理论上可以是任何语句,所以我直接在里面写写了输出cout语句。上述会先执行cout输出,后执行j–。回归正题,上述报错会提示未执行循环正文,实际上是由于定义的局部变量和内部首次判断产生了冲突,定义j=4,但是首次判断j<=3。情况2将j int定义在外部就不会出此错误。



本片文章参考C++ primer(第5版),C++ primer plus(第6版)和黑马程序员视频,如有错误,希望批评指正!!!

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhong_Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值