Bootstrap

通俗易懂解析for循环

通俗易懂解析for循环!

为什么要讲讲for循环

for循环是最为常见的循环,无论是在考试,在工作面试题,还是在算法题中,for循环肯定是少不了的。

有人说,for还不简单吗?设个i,设个条件设个i++什么的不就搞定了吗?

没错,用法上是这样,但其实for循环一旦在一些细节部分上一旦出错,for循环会成为你程序里错误的主要来源,因为for循环乃至计算机程序设计都太严谨了,不能有一丝一毫的差错,因为计算机自己是不会自己排错的,它自己的运行流程和编写者走的流程完全不一样它也不知道。

比如,在判断条件里,是大于还是大于等于?是小于还是小于等于?小小一个等号就可以把程序搞成另外一个样子,有做过数据结构尤其是排序有关习题的同学有不少都在这里栽过跟头。

再比如,for中的(A;B;C)到底执行的顺序是怎么样的?有关这个内容,期末考试有时会考。

所以完完全全,彻彻底底的搞懂for循环的所有步骤,让你可以自如使用for循环,做到你设计的for循环完全走的是你所设想的流程,可以让你对自己的程序有足够的信心。

详解for循环

基本语句拆解

格式

for(A;B;C)

{

D(循环体)

}

例:

for(int i = 0; i <10; i++)

{

printf(“%d”,i);

}

想必大家对这个格式非常的熟悉,但还是提一嘴

A:

表示循环变量赋初值,在for循环中,循环变量,比如例子中的i,是决定循环到底要不要继续进行的决定性因素(不考虑break一类特殊的语句),所以可以说,循环是围绕循环变量存在的。

这个A过程只会进行一次,可以说,A语句是最先执行也是只执行一次的语句,它把i赋完值就可以哪里凉快待哪里去了。

B:

for(int i = 0; i <10; i++)

{

printf(“%d”,i);

}

最最核心的区域,它规定了循环继续的条件,在这里就是说,i小于10时,就可以再开一次循环。换言之,i=10,或者i>10时,循环终止。

这也说明了,一旦循环终止时,i在此时一定是为大于等于10的值!

如果

for(int i = 0; i <=10; i++)

{

printf(“%d”,i);

}

什么意思?加了个等号,说明跳出循环时,i此时的值一定是大于10的!

C:

循环变量变动语句

一般是对循环变量作出改变的语句,这个大家都知道。

D:

是循环执行的内容,这个大家也都知道

但我其实想着重强调,这些个语句到底是什么时候执行的?它们的执行顺序是怎么样的?

所以接下来,我将分析的是:

for语句的执行顺序

例:

(接下来的分析会比较长,但我会写的通俗易懂)

for(int i = 0; i <=3; i++)

{

printf(“%d”,i);

}

首先是A语句,即变量赋值语句,它把循环变量i赋值为0。好了,它可以guna了。

然后,

注意,它会马上进行第一次判断,即马上进入B语句判定是否有资格进行第一次循环体!

最明显的反例:

for(int i = 0; i <0; i++)

{

printf(“执行我!”);

}

这个循环中,循环跳出的条件是i大于等于0,而一旦赋了初值后,i=0,符合终止循环的条件,直接就跳出循环,换言之,这里循环体的内容一次也不会使用!程序也不会打印任何东西!

for(int i = 0; i <=0; i++)

{

printf(“执行我!”);

}

这个循环中,循环跳出的条件是i大于0,赋了初值后,i=0,符合循环条件

所以打印一次“执行我”。

回到刚刚的例子:

for(int i = 0; i <=3; i++)

{

printf(“%d”,i);

}

循环变量 i 比3大时终止循环!

赋初值i = 0 ,就执行循环,符合循环条件,打印出了数字0

然后

当循环体执行完毕以后,才执行C语句,i++,使i变为1。

电脑不会耽误时间,i变为1后马上又送回B语句进行判定,发现还是符合循环的条件!

执行循环体,打印出了数字1

当循环体执行完毕以后,马上执行C语句,i++,使i变为2,发现还是符合循环的条件!

执行循环体,打印出了数字2

当循环体执行完毕以后,马上执行C语句,i++,使i变为3,发现还是符合循环的条件!

执行循环体,打印出了数字3

当循环体执行完毕以后,马上执行C语句,i++,使i变为4。

电脑不会耽误时间,把i=4送回B判定,发现i已经大于3了,所以,终止循环!

所以语句的执行过程是

A BDC BDC BDC BDC B

我们把D,即循环体出现了几次,就认为是执行了几次循环,最后肯定是B结尾(除非是死循环,那个算特殊情况),因为它是判定是否进行下去的唯一准则。

所以,基本的for循环执行流程就完全明白了。

在这里我写一下我理解for循环的要点:

1)对于循环什么时候结束,我个人感觉

比起去理解什么时候可以继续循环,我更倾向转而去分析什么条件下循环会终止,符合人的直觉,从上述例子可以看出思路。”循环就是为了终止“

2)DC是紧紧联系在一起的,一旦循环体D执行结束,别多想,马上执行C语句,判断什么的后面再说。

3)注意,循环体中也是可以对循环变量进行变动的,如:

for(int i = 0; i <=3; i++)

{

i++;

}

这种情况挺麻烦的,这时候推荐用纸笔稍微写一下理清思路,由于循环体中对循环变量的更改,判定上要小心一点,其他没什么。对了,不管循环体怎么动,它终究是D语句,不管你D有多浮夸(break等特殊语句除外),后面的C语句都一定会紧紧贴在一起,一定会一起执行的!

for循环中麻烦的循环变量

提问!

for(int i = 0; i < 5; i++)

{

printf(“执行我!”);

}

printf(“%d”,i); //你没有想错,这里会报错!

int i = 999;

for(i = 0; i < 5; i++)

{

printf(“执行我!”);

}

printf(“%d”,i);

还有:

int i = 999;
for (int i = 0; i < 5; i++)
{

printf(“执行我!”);

}
printf(“%d”, i);

它们有什么区别?

我们发现循环变量的来源不同。

第一个是在只循环体内部定义,在循环结束后,i会“销毁",所以在循环体外面是找不到i的,printf找不到要输出的变量,会报错!

第二个是在循环体外定义后拿到循环体里面用,由于是外面拿的循环变量,所以循环结束后i不会销毁,i的值发生的变动也会保留! 所以输出5

第三个在循环体内定义了i,在循环体外也定义了一个同名的i。你会发现,在Visual Studio里它不会报错,输出printf(“%d”, i);时,输出的是999,即循环体外定义的i的值,说明它们只是名字一样罢了,好比一个是山东的张三,一个是山西的张三,互不干扰。但不推荐这样写,非常容易混淆。

FOR循环是使用非常灵活,用途广泛的循环,通过仔细分析可以弄清所有的步骤。

就好像第一次插U盘方向总是不对一样,如果不对for循环的流程搞清楚,“一把乱抓”设计出的for循环在第一次执行总会出现各种各样的错误(本人亲身体会)。仔细分析流程后在设计出的for循环才是稳定可靠的for循环。

非常感谢您可以耐心读到这里,博客内容写的很粗糙,只是分享自己在学习中的一些想法,有错误指正和改进欢迎提出!

;