
3.4 循环语句
C++语言中主要提供了3种循环语句,分别为for语句、while语句和do while语句。其中,for语句用于根据循环次数来执行循环,而while语句和do while语句用于根据条件的真假来执行循环。本节将详细介绍这3种循环语句。
3.4.1 for语句
for语句是根据预知的循环次数来执行循环。其通用的语法格式如下:

例如,下面的代码利用for循环语句输出数组中的元素。
【例3.8】利用for循环语句输出数组中的元素。

对于for循环语句来说,其中的变量初始赋值、循环结束条件、变量递增每一项均可以省略,但是必须保证循环能够结束,即不能出现死循环。例如,下面的for循环语句省略了变量的初始赋值。
【例3.9】 省略for语句中的变量初始赋值。

在上面的代码中,for语句中省略了变量的初始赋值,因为在之前的代码中已经为变量赋值了。但要注意的是,for语句的变量初始赋值后面的分号不能省略。
下面代码中的for语句省略了循环结束条件。
【例3.10】 for语句中省略循环结束条件。

对于for语句来说,可以同时省略变量初始赋值、循环结束条件和变量递增。
【例3.11】 for语句中省略变量递增。

说明
虽然在使用for循环语句时,其中的变量初始赋值、循环结束条件和变量递增每一项均可以省略,但是笔者并不建议读者这样做,因为这种写法在逻辑中很容易出现错误,并且当循环出现问题时,检查错误将更加费时。
在上述代码中使用了break语句来终止循环。该语句还可以应用于switch语句,3.3.2节中曾作了介绍,此处不再赘述。在循环语句中,可以使用break语句来终止循环,也可以使用continue语句来结束本次循环。下面通过两段代码来演示break语句和continue语句的作用及其区别。break语句的应用代码如下。
【例3.12】 break语句在循环中的作用。(实例位置:资源包\TM\sl\3\4)

执行上述代码,结果如图3.5所示。
continue语句的应用代码如下。
【例3.13】 continue语句在循环中的作用。(实例位置:资源包\TM\sl\3\5)

执行上述代码,结果如图3.6所示。

图3.5 break语句应用

图3.6 continue语句应用
分析上述两段代码。当循环语句中遇到break语句时将结束循环,因此第一段代码只执行了两次循环;当循环变量i的值为2时,终止循环,因此只输出了如图3.5所示的两个元素。而continue语句用于结束本次循环,进入下一次循环,因此在第二段代码中,当循环变量i的值为2时,结束了本次循环,进入下一次循环,导致没有输出数组中的第3个元素,因而出现了如图3.6所示的结果。
在2.5.1节中笔者曾经提到逗号表达式的一个主要应用是在for语句中修改循环变量。下面的代码演示了逗号表达式在for循环语句中的应用。
【例3.14】 逗号表达式在for循环语句中的应用。

在使用for语句时,应该注意的一个问题是循环变量的作用范围。对于微软的C++编译器来说,循环变量的作用范围为当前定义循环处至当前函数或复合语句的结束。对于其他公司的C++编译器来说,其循环变量的作用范围可能仅限于循环语句内。例如,下面的代码在Visual C++ 6.0中是合法的。
【例3.15】 循环变量的作用范围。

而下面的代码在Visual C++ 6.0中是非法的。
【例3.16】 循环变量在复合语句中的作用范围。

上述代码中,循环语句位于一个复合语句内,因此循环变量i在复合语句结束时就失效了。因此,在复合语句之外访问循环变量i,将出现标识符没有定义的错误。
3.4.2 while语句
与for循环语句不同的是,while循环语句根据表达式的真假来判断是否进行循环,即当表达式的值为真时执行循环,当表达式的值为假时退出循环。while语句的语法格式如下。

下面利用while语句来计算1~100的累加和。
【例3.17】使用while语句累计求和。

注意
在使用while循环语句时,一定要设置循环结束条件,否则将进入死循环,这是许多初学者经常犯的错误。在上述代码中,如果不执行“i++;”语句使i自加1,程序将进入死循环。
3.4.3 do while语句
do while循环语句与while语句类似,只是它先执行一次循环体,然后才根据表达式的真假来判断循环是否结束。do while语句的语法格式如下。

下面利用do while语句来实现1~100的累加求和。
【例3.18】 使用do while语句累计求和。

注意
在程序中使用do while语句时,不要忘记while语句部分在末尾要添加分号。
do while语句与while语句都是根据表达式的真假来判断是否结束循环,那这两个语句之间有什么区别呢?下面笔者举一个例子,假设有甲、乙两个人,甲习惯在吃东西前先看一下食品是否在保质期以内,而乙则是急性子,每次都是先打开食品,吃一口以后才看看食品是否过期。以循环语句来说,甲相当于while语句,乙相当于do while语句,吃东西相当于循环体,查看食品保质期相当于循环条件,通过上面的条件得知,甲在吃东西前先查看保质期,如果没过期则可以放心食用,如果过期则不会吃;而乙不同,乙在查看保质期时已经吃了一口,如果食品没过期则继续食用,但是如果食品已经过期,乙也无法改变已经吃了过期食品的事实。笔者举这个示例不是说while语句比do while语句好,只是要提醒读者,在使用do while语句时,一定要谨慎,以免发生不可挽回的后果。
3.4.4 嵌套循环语句
所谓嵌套循环语句,是指循环语句中还包含有循环语句。例如,在for语句中还可以包含for语句、while语句和do while语句,while语句同样也可以包含for语句和do while语句等。在程序中使用嵌套循环,可以实现复杂的逻辑操作,如开发人员经常使用嵌套循环语句来访问二维数组中的元素。
【例3.19】 使用嵌套循环语句访问二维数组。(实例位置:资源包\TM\sl\3\6)

执行上述代码,结果如图3.7所示。

图3.7 嵌套循环语句