C++-为什么在for循环的括号里定义的变量可以循环读写而while里定义的不行?
看下面这段c++代码:
int main()
{
for(int i=1;i>0;)
{
i--;
printf("for hello!n");
}
while(int i=1)
{
i--;
printf("while hello!n");
}
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
一般,除for外,while最好不要在头语句中定义变量。While定义语句是“重定义--消亡论”:在循环中定义的变量在每次循环里都要经历创建和撤消的过程。如下程序i变量定义域在块内,会多次输出2:
int cc=1;
while(int i=1)
{
cc++;
i++;
cout<<i<<endl;
if(cc>10) break;
}
while允许在块中重复定义一次变量
while(int x=3)
{
cc++;
int x=2; //这句不出错
//int x=1; //再加上这句重定义出错
if(cc>10)
break;
}
应该说此时while头语句中的int x=3会被忽略。
再来看下for语句,它与while不一样。
如下程序输出10。如果定义域仅在for块中,i应该是不可视的。
for(int i=0;i<10;++i);
cout<<i<<endl;
可以看到,上面的for语句分解如下:
int i=0;
for(;i<10;++i);
想想也是,如果int i=0;放在块内,之前的i<10;i++中的i就不可见了。
所以说是“被迫的”规定。
每次while语句里边都被定义了一次,都返回true,所以会无限循环下去;而for里边有i--,实际上就等于for语句中的第三段
1、在for(1;2;3)循环中,第1个句子只有在循环开始时执行一次,而第2、第3个句子则在后边的循环中每次都会执行,所以相当于只执行了一次int i=1,只对i作了一次定义,就可以循环读写前边对i的修改;
2、在while(int i=1)相当于每次循环都对i进行重新定义,所以,会出现无限循环。
首先你要确定for和while里面的各个字段分别表示什么含义:
for的括号里面分为三个部分,这三个部分用 “;”隔开:
1.表示初始化循环变量,整个for语句只会在第一次进入的时候执行;
2.表示判断条件,在每次进入for循环里面之前会执行判断,如果条件为true才会进入for循环;
3.表示增量操作,每次for循环结束的时候都会执行第3部分的语句,这里可以对循环变量做一些增量操作,从而控制循环。
while语句的括号里的内容表示的是判断条件,与for语句括号里面的第2部分一样,在每次进入while循环之前都会执行判断,如果条件为true就进入while循环。
说到这里就容易理解了,你的for语句里面的 i 初始化为 1 ,后来在循环体里面自减了,第二次执行判断的时候条件不成立了,所以只执行了一次。
你的while语句括号里面是一个变量定义的语句,它作为条件判断总是成立的,得到条件为 true ,所以会进入循环体,尽管里面的 i 自减了,但是下次再判断的时候,还是一个变量定义语句,条件依然成立,所以每次都会进入循环体。
for()里面的叫做expression。while()里面的叫做condition
因为你的while的条件有问题!int i=1并不能当做一个条件表达式,最好也不要再while的条件里定义变量。然后因为for循环体里有i--语句所以下次循环的时候可以保持递减值,而while循环因为在条件里定义变量i,所以每次循环都重新定义了一次!正确的写法是:
int i = 1;
while(i>0)
{
i--;
printf("while hello!n");
}