
3.5 跳转语句
所谓跳转语句,是指能够影响程序执行顺序的语句。C++语言中主要提供了5种跳转语句,分别为break语句、continue语句、goto语句、return语句和exit语句。其中,break语句和continue语句在介绍for循环语句时已经作了介绍,本节主要介绍goto语句、return语句和exit语句。
3.5.1 goto语句
goto语句又称为无条件跳转语句,用于改变语句的执行顺序。goto语句的一般语法格式如下:

其中,标号是用户自定义的一个标识符,以分号结束。下面利用goto语句实现1~100的累加求和。
【例3.20】 使用goto语句实现循环。

上述代码中,利用标签实现了原始的循环功能。当语句执行到“if(ivar <100)”时,如果条件为真,则不停地转到标签定义处。
注意
这是一种古老的跳转语句,它会使程序的执行顺序变得混乱,CPU需要不停地进行跳转,效率比较低,因此在开发程序时要慎用goto语句。
在使用goto语句时,应注意标签的定义。在定义标签时,其后不能紧接着出现“}”符号。例如,下面的代码是非法的。

在上述代码中,定义标签时,其后没有执行代码了,所以出现编译错误。如果程序中出现上述情况,可以在标签后添加一个空语句,以解决编译错误。例如:

在使用goto语句时还应注意,goto语句不能越过复合语句之外的变量定义的语句。例如,下面的goto语句是非法的。

在上述代码中,goto语句试图越过变量i的定义,导致编译错误。解决上述问题的方法是将变量的声明放在复合语句中。例如,下面的代码是合法的。

3.5.2 return语句
return语句用于退出当前函数(有关函数的介绍参见4.1节)的执行。当程序在当前函数中执行时,遇到return语句将退出当前函数的执行,返回到函数的调用处继续执行,如果当前函数是主函数(main函数),则退出应用程序。下面的代码演示了return语句的应用。
【例3.21】 使用return语句提前结束函数。

在上述代码中,如果价格错误,将通过“return false;”语句提前结束函数。其中,false表示函数ValidateData的返回值,类型为bool。如果函数没有返回值,应只使用return语句。
【例3.22】 使用return语句提前结束无返回值函数。

注意
在使用return语句提前结束函数时,需要注意如果代码之前在堆中分配了内存,则在return语句之前应释放内存,以防止产生内存泄漏。
【例3.23】 使用return语句时注意内存泄漏问题。

3.5.3 exit语句
exit语句用于终止当前调用的进程,通常用于结束当前的应用程序。实际上,exit是一个退出当前调用进程的函数,它包含一个整型参数,标识进程退出代码。它与return语句不同,return语句只是退出当前调用的函数,除非当前函数是应用程序的主函数,return语句才结束当前调用进程;而exit语句直接结束当前调用进程,无论当前函数是否为应用程序主函数。下面的代码演示了exit语句的作用。
【例3.24】 使用exit语句结束应用程序。

当调用ExitDemo函数传递一个0值时,将结束当前应用程序;传递一个非零值时,则ExitDemo函数不会进行任何操作。