goto语句在C语言中可以实现无条件跳转,通过和if语句的有效组合也可以实现循环结构。
goto标号名;
【例1】使用goto语句实现的死循环。
#include <stdio.h>
int main(void)
{
infinite_loop: //标号
printf("死循环!!!\n");
goto infinite_loop; //跳转至指定标号
}
【运行结果】程序运行后,进入死循环,反复打印一行字符串。使用【Ctrl+C】快捷键终止执行。
【代码解析】本程序是goto语句改变程序语句执行顺序的经典范例。第4行,为一个标号语句,在程序中并不执行任何功能,只是对语句做标识的作用。第6行,这是一个goto语句,该语句执行后程序将无条件地跳转到程序标号“infinite_loop”后执行代码。由于程序执行到第6行并跳转到第4行,一直重复执行打印语句,陷入死循环。
使用goto语句改写if-else语句,形式如下:
if ( 表达式 ) {
操作1;
goto else_end;
}
else_start:
操作2;
else_end:
后续操作;
使用goto语句实现for语句,形式如下:
表达式1; /* 即初始化表达式 */
for_start:
if ( 表达式2 ) { /* 即判断表达式 */
操作;
表达式3; /* 即变量控制表达式 */
goto for_start;
}
使用goto语句实现while语句,形式如下:
while_start:
if ( 表达式 ) {
操作;
goto while_start;
}
使用goto语句实现do-while语句,形式如下:
do_while_start:
操作;
if ( 表达式 )
goto do_while_start;
但是,上面这些代码的展示,只是告诉读者goto语句使用的灵活性,但不鼓励使用以上的代码形式。
【例2】使用goto语句结束多层循环
#include <stdio.h>
int main(void) {
int i, j;
int data;
int sum = 0;
const int m = 3; /* 行数 */
const int n = 3; /* 列数 */
printf("Please input a %d*%d matrix:\n", m, n); /* 提示输入矩阵规模 */
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j) {
printf("matrix[%d][%d](>0) = ", i, j); /* 提示要输入的矩阵元素 */
scanf_s("%d", &data); /* 输入元素值 */
/* 输入非法,则退出内部循环 */
if (data <= 0) {
printf("Error: wrong data!!! Exit loop\n");
goto ERROR_DATA; /* 跳转到指定标号处 */
}
sum += data; /* 求和 */
}
}
printf("The sum of numbers in this matrix is %d.\n", sum);
/* 输出总和 */
ERROR_DATA: /* 指定的标号 */
return 0;
}
【代码解析】本程序使用goto语句改写了范例2的break语句。当输入一个小于0的数值时,第14行的if判断表达式为真,则进入if体,输出错误信息后执行goto语句。由于ERROR_DATA设置return语句前,因此,goto语句将程序跳转至return语句处,跳出了二层for循环,直接执行return语句结束程序。
提示:第19行输出矩阵元素和时,也不需要判断数据输入是否正常,因为如果输入有错误,该printf语句会被跳过。
当程序对多种情况的处理方式完全相同时,便可以使用goto语句。这不仅可以加强代码可读性,还可以较少代码量。