C++新经典
上QQ阅读APP看书,第一时间看更新

5.1.2 goto语句

首先讲解第一个循环控制语句:goto语句。goto语句被称为“无条件转向语句”,用来跳转到某个程序位置进行执行。它的一般形式为:

其中,语句标号是一个标识符。回顾一下标识符:只能由字母、数字、下画线三种字符组成,且第一个字符必须是字母或者下画线,并且标识符不可以是系统中的保留字。看如下代码:

goto是一个有争议的语句,有人说goto语句的使用会使程序的可读性变差,所以要限制使用,其实,作为程序开发人员,如果有使用的必要,能够简化程序流程、提高工作效率,那么就使用,不需要卷入这种争议中来。

看一看goto语句的主要用途:

(1)与if语句一起构成循环结构。

(2)从循环体内跳转到循环体外(后面会介绍循环体的概念),不过并不推荐这种跳转方式,因为这破坏了结构化程序设计原则,除非万不得已没有更好的实现办法时才这样用。

看一个具体的范例,做1到100的加法运算。代码如下:

上面这段代码,可以用加断点并逐行跟踪的方式来跟踪看一看执行的过程。可以看到,这里的“loop:”行是语句标号行,loop本身是一个标号名,后面跟一个冒号,当程序流程执行到“gotoloop;”语句时可以直接跳转回loop标号所在行并重新继续往下执行,如此反复。if条件每成立一次,i值就不断加1(依靠“i++;”这句代码),sum也不断累加最新的i值(sum=sum+i;),当i值超过100时,if条件不再成立,程序执行流程直接跳过if语句执行后面的printf语句输出结果值。

上面这个范例只是一个演示,在很多情况下,可以用其他的循环语句来代替goto语句,所以,目前来看,goto语句的应用场合会比较少,除非觉得goto语句特别有必要用的时候才会使用。

另外,将来学习函数时,还要知道一点:goto语句不能跨函数使用。这里可以简单写两个函数来看一下:

上面的代码中有func1、func2两个函数,每个函数的函数体都用{}括起来,每个函数中各有一个标号,名字分别叫lbl1和lbl2,在函数func1中有一个goto语句,可以跳转到lbl1标号指定的行,因为goto语句和lbl1标号行都处于同一个函数func1函数中,这样做是没问题的,但是不能把func1函数中的“gotolbl1;”修改为“gotolbl2;”,这样会导致语法错误,因为lbl2标号处于func2函数中,goto语句不能跨函数跳转。