
5.1.4 do…while语句
现在讲解“直到型”循环结构,也就是do…while语句。它的一般形式为:

看一看程序执行流程图,如图5.2所示,其中一般形式中提到的“要执行的语句”,也就是图5.2中的“循环体语句”。

图5.2 直到型循环结构执行流程图
用语言描述一下整个执行流程:直到型循环结构的最大特点是先执行一次循环体语句,然后判断表达式的值,如果表达式的值为真(非0)时,继续执行循环体语句,然后继续判断表达式的值,如此反复,一直到表达式的值为假(0),跳出整个do…while循环继续往后执行。
那么这里的直到型循环结构和前面讲的当型循环结构最大的不同在哪里呢?
(1)当型循环结构:当表达式值为假(0)时,循环体语句一次都不执行。
(2)直到型循环结构:至少执行循环体语句一次,然后才判断表达式值是否为真(非0),如果表达式的值为真,则继续执行循环体语句,如此反复,一直到表达式的值为假(0)。
看看如下范例,这次所做的演示是用do…while语句把刚才用while语句进行的1到100的加法运算再重写一次:

可以看到,上面分别用while这种当型循环语句以及do…while这种直到型循环语句演绎了1到100加法运算的过程,这两种写法完全等价,结果当然也完全相同。
那么,什么时候当型循环语句与直到型循环语句所写的程序代码会得到不同的结果呢?前面已经描述过两者的区别,也就是说,如果“表达式”的值一开始就为假(0)的时候,while与do…while这两种循环语句所写的代码得到的结果就会不同,看看具体的写法:
(1)先用当型循环语句while实现一次下面的从1加到10的求和范例代码:

(2)再用直到型循环语句do…while实现一次和上面范例相同功能的代码:

目前,这两段范例代码的执行结果相同,现在把这两段范例代码每一段中变量i的初值都从1修改为20(即i=20),再看看两个范例的执行结果,可以看到:
· 当型循环语句while的执行结果为sum=0。
· 直到型循环语句do…while的执行结果为sum=20。
为什么此时两个范例的执行结果不同了呢?因为此时对于while循环来讲,循环体一次也没执行,而对于do…while循环来讲,会执行一次循环体。
所以,得到一条结论:当循环语句中表达式第一次的判断结果为真(非0)时,两种循环得到的最终结果相同,否则,两种循环得到的最终结果不同。
在实际应用中,while语句使用的场合更多,do…while语句使用的场合相对较少,因为多数情况下,do…while语句可以被while语句取代。