首页 理论教育 C语言程序设计基础教程:3种跳转语句解析

C语言程序设计基础教程:3种跳转语句解析

时间:2023-10-27 理论教育 版权反馈
【摘要】:知识学习C语言中提供了3 种实现跳转结构的语句:break 语句、continue 语句和goto 语句。这里重点讲解break 跳出循环语句的情况。图3.43continue 语句流程图输出100 ~200 以内所有不能被3 和7 同时整除整数。图3.45类比continue 和break 区别gotogoto 语句为无条件转移语句,即转向到指定语句标号处,并执行标号后面的程序。

C语言程序设计基础教程:3种跳转语句解析

经过前面的循环发现,需要遍历完范围内所有的值,其实有些时候,正确的结果只是出现在中间,那后面的遍历也就没有任何意义,所以C语言就提供了一种跳转的结构。这种结构一般需要和分支结构或者其他循环结构配合使用。

任务描述

一般循环是当循环条件为真则执行循环操作,当循环条件为假则循环终止,但是在实际使用过程中会遇到需要在循环执行过程中停止循环的情况,若要实现该操作,就要学习本任务所介绍的跳转语句:goto、break 和continue 等。

知识学习

C语言中提供了3 种实现跳转结构的语句:break 语句、continue 语句和goto 语句。

(1)break

break 可以跳出开关语句和循环语句,前面所学习switch 语句是开关语句。break 在switch中的用法,已在前面介绍开关语句时的例子中碰到,这里不再举例。这里重点讲解break 跳出循环语句的情况。

当break 语句用于do-while、for、while 循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break 语句总是与if 语句联在一起,即满足条件时便跳出循环,不过一个break一般只向跳出向外一层的循环,如图3.39所示。

图3.39 break 跳转流程图

前面讲过一个求最大公约数的程序,当时是从1 开始遍历一直到两数最小值结束,但是仔细思考后会发现,两数的最大公约数如果存在很多时候应该更接近于最小值,可以先从最小值开始判断,逆序往前查找,当找到满足同时被整除数的数时,就找到了最大公约数,就不需要再继续查找了,此时就可以借助break 退出了。

程序结果如图3.40所示。

图3.40 反序求最大公约数

再来看一个判定素数的例子,素数也称质数,是指除了1 和它本身外没有其他的约数存在,本书编写的程序是不考虑对1 的判断的。

分析:基本思路那就从2 开始到n-1 进行循环,看看是不是都不能被它本身整除,如果不能就输出,如果发现有整除的数,断定该数一定不是素数了,那就没有必要在往后遍历,所以这个时候就可以退出了。

程序结果如图3.41所示。

图3.41 判断是否为素数

思考:这个程序其实并不是很优化,对于判断出不是素数的部分没有太大的问题,主要是对于判定是素数的过程,依然做了无用功,这是什么意思呢?

比如13 这个数,它不是素数,循环的范围是2 ~12,所以循环体执行了11 次,但是应该注意到这样一个本身存在的事实:13 对于7 ~12 这个范围的所有数一定不能整除,那程序中一开始就可以把这部分给省去,也就是说只要2 ~6 这个范围内没有能整除的,这个数一定会是素数,这样的循环体最多需要执行5 次,6 其实是13 除2 的结果。此时程序就可以修改为:

从这个角度出发,有人发现其实只需要判断从2 到sqrt(n)这个范围内没有能整除的数,就可以判定该数是素数。sqrt()是求一个数的平方根

如果不了解sqrt 函数,可以用i*i< =n 替代。

读者思考一下,如果要求出给定范围内所有的素数该怎么处理呢? 对就是在该循环体的外围在加一层循环(下面的程序是自动把1 排除在外的):

程序结果如图3.42所示。

图3.42 显示范围内素数

(2)continue

continue 语句用于结束本次循环,即在循环体中遇见continue 语句,则循环体中continue语句后面的语句不执行,接着进行下一次循环的判定。通常情况下,continue 语句总数与if 语句组合在一起,用来加速循环,如图3.43所示。(www.xing528.com)

图3.43 continue 语句流程图

输出100 ~200 以内所有不能被3 和7 同时整除整数。

分析:要求输出能被同时整除的数,并不是同时整除。如果是同时整除,这道题目就简单了很多。

首先要借助循环从100 开始依次到把到200 以内的数全部遍历。在循环体中如果去写不能同时整除的条件,if 后的表达式就太过于复杂了,需要考虑能被3 整除,不能被7 整除或者能被7 整除,不能被3 整除,还有就是既不能被3 整除,也不能被7 整除。那我们可以反其道思考,它们另外一部分就是能同时被整除,那就在发现同时整除时结束本次循环,如果if 不成立时再输出。

代码如下:

程序结果如图3.44所示。

图3.44 输出不能被3 和7 整除的数

continue 和break 虽然都用于循环,且一般和if 语句组合,但是两者还是一定的区别:continue 语句只是终止本次循环,但是依然在持续后续的循环,如果是for 中使用,此时会跳转到for 循环的表达式3 处,不执行的也就本次循环continue 后面的语句。对于break 来说则是终止整个循环,所有的循环体都不会在执行了。可以通过两者的流程图再来对比一下跳转到的位置,break 是跳到循环体外的线上,continue 是跳到循环体内的线上。

两者的区别可用这样一个例子比喻一下,在杀毒软件杀毒的过程其实就是循环遍历计算机上文件,然后检测这些文件是否感染到病毒。如果发现某个文件查找当前的这个文件,计算机就可以选择“跳过此文件”的功能,这就相当于continue 语句,但是后续其他的文件仍需继续查杀;如果不想查杀病毒了,就可以点关闭按钮退出后续所有文件的查杀,这就相当于break语句,如图3.45所示。

图3.45 类比continue 和break 区别

(3)goto

goto 语句为无条件转移语句,即转向到指定语句标号处,并执行标号后面的程序。

它的一般形式为:

goto 语句标号;

语句标号的命名需要符合C语言对标识符的命名规则。标号必须加在某个语句的前面,并且在标号后面使用冒号。当程序执行到goto 语句后,程序转移到标号指定的语句继续执行。标号只对goto 语句有意义,当其他场合下遇见语句标号,则直接执行语句而忽视标号的存在。

标号必须与goto 语句同处于一个函数中,可以不在一个循环层。在结构化的程序设计中,goto 语句很容易引起程序流程的混乱,打破单入口单出口的特点,使程序层次不清,可读性差,所以不主张使用goto 语句,所以读者了解能看懂别人的程序就可以了。

goto 语句主要应用在以下两个方面:

①goto 语句和if 语句一起构成循环结构。

②打破break 和continue 的跳转局限性,可实现多重循环的跳出。

由于不作为重点,本书只演示第一个方面的应用,所列举的例子还是前面出现过的一个求前100 项整数和问题。

程序结果如图3.46所示。

图3.46 goto 和if 组成循环

任务总结

goto 语句通常与条件语句配合使用,可用来实现条件转移、构成循环、跳出循环体等功能。但是,在结构化程序设计中一般不主张使用goto 语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。

break 在一些计算机编程语言中是保留字,其作用大多情况下是终止所在层的循环。在C语言的switch(开关语句)中,break 语句还可用来在执行完一个case(分支)后立即跳出当前switch 结构。在某些程序调试过程中则使用break 设置断点。在多层循环中,一个break 语句只向外跳一层。

continue 表示结束本次循环而不终止整个循环的执行,进行下一次循环。

在实际使用时,要注意break 和continue 的联系与区别。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈