2 循环执行语句
计算机有一个强大的能力,快速地重复执行某一计算,这种重复计算多次的方法,是通过软件中的循环执行语句去实现的。C语言中实现循环语句结构的方式有三种,第一种为“for”循环,第二种为“while”循环,第三种为“do……while”循环。不管是那种循环,其循环的方式都是类似的,即在某一条件成立的情况下(为True,或者非0),某一范围内的某条或某几条语句就会被一次循环执行,循环执行语句的示意如图3-8-7所示。
图3-8-7 循环执行语句
(1)while循环
while语句的一般使用形式为:
while(判断条件)
{
执行语句;
}
其中判断条件可以为表达式,也可以是一个变量,只要表达式或者变量不为0,那么while后面的执行语句将一直被循环执行。如果while条件后面只跟随一句执行语句,那么while后面的一对“{}”可以不加。
例如,当我们需要连续打印出1到100的时候,用while语句即可轻松实现,其实现代码如图3-8-8所示。
图3-8-8 while循环打印
图3-8-8代码中,i定义完成之后,赋初值为1,“i <= 100”是一个判断条件,只要这个表达式为1,即条件成立,那么代码就一直会把“i”打印出来,而变量i每次在打印完成之后,就对自己加1,这样,当执行99次之后,i=100,此时“i <= 100”这个条件还是成立,进而再执行一次“i+1”,此时i=101了,再去判断“i<=100”已经不成立了,因此while循环最终退出。
当然,C语言在设计之初就设计了循环的退出机制,“continue”和“break”就是循环退出机制的两个关键词。这两个关键词虽然都可以使while循环中断退出,但是其效果和功能有着非常大的区别。“break”关键词是让整个while循环彻底退出,而“continue”关键词是让本次的循环中断运行,进而进行下一次while的循环以决定这个循环需不需要继续执行下去。关于“continue”关键词我们可以做一个简单的程序来说明一下其功能。如图3-8-9所示。
图3-8-9 continue关键词
这个程序的主体和图3-8-8中的代码一样,只不过加了一个判断条件,当i加到5的时候进行判断,直接给变量i赋值200,之后再运行continue语句,由于continue语句执行了,因此循环在此处就中断了,直接进行while条件的判断,而此时下面的printf语句也就不会被执行了。在while的判断下,发现此时“i <= 100”这个条件不成立了,因此退出了while循环。
利用while循环和continue的组合,我们还可以做很多有趣的程序,如,找出1~1000中所有能被3整除的整数。程序代码如图3-8-10所示。
图3-8-10 找出1000以内能被3整除的数
而break的语法就是直接退出整个while循环,我们可以写一个软件来验证这个while的用法,做一个键盘字符获取程序,程序平时一直在等待按键输入,并将按下的按键打印出来,直到当按下小写字符“k”的时候,程序打印出goodbye并且退出。如图3-8-11所示,此时while的判断条件是一个常数1,因此可以说while在任何情况下都不会退出,但是一旦当获取到的按键为“k”,此时if判断语句中的条件就成立,运行break语句,最终打印出good bye,并且退出while(1)这个循环。可能做纯软件的读者会觉得我这里的while(1)用的非常荒唐,再怎么样也要写一个退出条件比较考究,但是在很多的裸机系统中,就是通过一个while(1)的大循环使芯片里面的程序连续运行的。
图3-8-11 按键字符判断
(2)do……while循环
do……while语句,在一些书上也称作do语句,它很像while语句,只是它的运行条件判断,要在循环体执行完一次之后再去判断。所以,这种结构的循环体至少会被运行一次,下面是它的语法。
既然while和do……while的用法很相似,那我们如何在它们之间进行选择呢?
当需要循环体至少执行一次的时候,选择do。
比如,还是一个按键判断的程序,当输入的字符不为小写字母“k”的时候,将这个数字打印出来,如果是小写字母“k”就退出程序,打印出good bye。这个程序由于要求我们对输入的第一个字符就需要判断,因此在不用break和while(1)的情况下,我们可以直接使用do……while的形式来完成。其代码如图3-8-12所示。
图3-8-12 字符判断程序
(3)for循环
C语言中,for循环语句是while循环语句的一种简化方法,for语句的一般形式为:
通过上几小节的练习,我们发现一个规律,即有限次数的循环程序,一般都会定义一个控制循环次数的变量,而for循环语句中的表达式1为初始化部分,即我们可以对定义的这个控制循环次数变量进行初始化。表达式2为条件部分,当表达式2成立的时候(True,非0),for循环一直运行下去,一旦当表达式2的条件不满足,则退出for循环。表达式3为调整部分,它在每一次循环体运行完成一遍之后,都会执行表达式3。与while循环一样,在for语句中,也可以使用break语句和continue语句来中断循环。
如我们需要找出1~1000中所有能被3整除的整数,除了图3-8-10中用while循环的程序外,还可以用for语句来实现。如图3-8-13所示。
图3-8-13for语句寻找能被3整除的数
图3-8-13,for语句后面的三个表达式分别为:
初始条件:i = 1;
判断条件:i <= 1000;
调整语句:i ++;这里的i可以根据需求自行调节。
循环控制语句后面我们在实际使用中会频繁用到,因此后面让我们来慢慢探索。