3.4.2 do…while 语句
do…while 语句也称为 do…while 循环。仅从名字上看,do…while 语句与 while 语句非常相似,但是在使用格式和执行顺序上有着明显的不同。do…while 的使用格式如下:
do 语句 while(表达式);
由 do 关键字打头,接着是循环体语句(单条语句或复合语句),最后是 while 关键字与表达式。当 do…while 语句被执行时,首先会执行一次循环体语句,然后再判断 while 后面小括号内表达式的值。当表达式的值为假时,do…while 语句执行完毕;若表达式的值为真,则会再次执行循环体语句,并再次去检查表达式的值,如此反复,直至表达式的值为假,其执行流程如图 3.6 所示。
图 3.6 do…while 语句的执行流程
下面用 do…while 语句来重新写一下前面的程序。代码如下:
这份代码和之前的代码内容基本相同,只是把原来的 while 语句部分换成了 do…while 语句。所以现在把眼光就聚焦在这个 do…while 语句上,和之前的 while 语句对比一下发现,其中的循环体部分也没有任何变化,只有小括号内的表达式不一样了。在之前的 while 语句中表达式使用的是后缀的自减运算符,而在 do…while 语句中的表达式却使用了前缀的自减运算符。为什么不能和之前一样使用后缀的自减运算符呢?相信读者已经有疑问了。
带着疑问,先来看一下 do…while 语句的实际运行情况:
Please enter the number of students: 3 Please enter the scores of 3 students: 80 75 60 Total:215, Average:71.67
这个运行情况和结果也和之前的一模一样,do…while 语句的执行步骤如下:
① 获取用户输入的 80,保存到变量 score 中;
② 将变量 score 的值累加到变量 sum,此时 sum 的值为 80;
③ 表达式“––i”的值为 2(变量 i 的值同为 2),为真,执行循环体;
④ 获取用户输入的 75,保存到变量 score 中;
⑤ 将变量 score 的值累加到变量 sum,此时 sum 的值为 155;
⑥ 表达式“––i”的值为 1(变量 i 的值同为 1),为真,执行循环体;
⑦ 获取用户输入的 60,保存到变量 score 中;
⑧ 将变量 score 的值累加到变量 sum,此时 sum 的值为 215;
⑨ 表达式“––i”的值为 0(变量 i 的值同为 0),为假,结束 while 语句。
从这个执行步骤上看,比之前使用 while 语句时少了一步。原来的 while 语句的第一步是检查表达式的值,如果为真执行循环体,如果为假则结束;而现在的 do…while 语句并不是这么做,它首先执行了循环体部分,然后才去检查表达式的值。也就是 while 语句是先检查表达式,再执行循环体;而 do…while 语句是先执行循环体,再进行表达式的检查。因此,按表达式检查顺序的不同,while 语句属于入口检查的循环,而 do…while 语句属于出口检查的循环。
由于 while 是入口检查的循环,所以当表达式的初始值为假的话,会造成循环体一次也执行不了。而 do…while 是出口检查的循环,所以即使表达式的初始值为假,循环体也仍会被执行一次。所以现在可以解释读者刚才的疑问了,在这个 do…while 语句中,如果也使用后缀的自减运算符,就会让表达式出现 3 次为真的情况,再加之它会首先执行一次循环体,所以最终的程序运行中会执行 4 遍循环体,这明显是不正确的。
但是这个程序使用 do…while 语句真的好吗?如果有用户输入的学生数量为 0 会怎样?由于使用 do…while 语句,即使学生数量为 0,也会去尝试读取一个学生的成绩。而使用 while 语句就不会出现这个问题,因为它首先就能够检查出表达式的值为假,所以就不会去执行循环体,当然也就不可能去尝试读取学生的成绩了。所以当无法确定循环体是否应该被执行时,不应该使用 do…while 语句;反之,如果可以断定这个循环体至少也要被执行一次时,再去使用 do…while 语句。这样才是最明智的选择。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论