返回介绍

3.4.2 do…while 语句

发布于 2025-04-11 22:32:54 字数 2463 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。