goto基本语句总结

 

最近由于部分项目使用到了goto语句,所以需要去了解下。本篇文章将讲一下自己对于goto语句的理解和总结。

什么是goto

goto语言又被称为无条件转移语句,听到无条件转移,一般人就会想到条件转移,所以对于系统程序员来说,一般会和硬件打交道,早期使用的还是汇编语言,所以是没有if else while的语句的。正因为goto语句有点汇编的意思,所以大多数所谓的大神级人物都会使用goto语句,其实不是因为他们用goto语句才显得厉害啦,而是可能习惯了汇编的语法。而现在大部分的程序员接触到的语句大多是结构化的语句比如if else while do,所以自然会多多少少抵触goto语句啦。

要不要使用goto

在这里就不探讨到底要不要使用goto语句啦,不同类型的程序有不同需求和习惯,选择合适自己的才是最好的嘛。

goto语句

goto loop形式

写法1:
#include <stdio.h>
int main(void){
    int i,sum=0;
    i=1;
    loop: if(i<=100){
        sum=sum+i;
        i++;
        goto loop;
    }
    printf("%d\n",sum);
    return 0;
}

此时的输出结果是:1到100的和5050

解释:由于i开始的时候 < 100,所以一直循环,当i = 101的时候,i <= 100的条件不成立,所以不会执行if语句,所以就不会执行到goto loop,接着执行到printf,最后执行return 0,程序结束。

写法2:
#include <stdio.h>
int main(void){
    int i,sum=0;
    i=1;
    loop: if(i<=100){
        sum=sum+i;
        i++;
    }
    goto loop;//注意这条语句的位置
    printf("%d\n",sum);
    return 0;
}

此时的输出结果是:无限循环,没有结果输出

解释:由于i开始的时候 < 100,所以一直循环,当i = 101的时候,i <= 100的条件不成立,所以不会执行if语句,但是,虽然跳过if内的语句,接着又会执行goto loop语句,所以当i > 100的时候,程序虽然不会进入if括号内的语句,但是却会一直执行goto loop,导致无限循环

goto xx形式

写法1:
int main(void)
{
	int a = 2, b = 3;
	if (a<b)
		goto aa;
	aa:printf("s\r\n");//注意aa的位置
	printf("hello1\r\n");
	
	printf("hello2\r\n");
	return 0;
}

此时的输出结果是:s回车hello1回车hello2

解释:由于a < b,执行goto aa,所以执行pinrtf(“s\r\n”),接着顺序执行printf(“hello1\r\n”)和printf(“hello2\r\n”)和return 0,程序结束

写法2:
int main(void)
{
	int a = 2, b = 3;
	if (a<b)
		goto aa;
	
	printf("hello1\r\n");
	
	printf("hello2\r\n");
	aa:printf("s\r\n");//注意aa的位置
	return 0;
}

此时的输出结果是:s回车

解释:由于a < b,执行goto aa,所以执行pinrtf(“s\r\n”),接着顺序执行return 0,程序结束

写法3:
int main(void)
{
	int a = 2, b = 3;
	aa:printf("s\r\n");//注意aa的位置
	if (a<b)
		goto aa;
	
	printf("hello1\r\n");
	
	printf("hello2\r\n");
	
	return 0;
}

此时的输出结果是:无限打印出s

解释:由于a < b,执行goto aa,这里注意aa是在if条件语句上方,所以执行完aa语句后,又重新进入if条件语句,由于a,b被初始化后一直没被改变过,所以条件永远成立,所以每次判断后都会重新进入goto语句,程序陷入无限循环中

写法4:
int main(void)
{
	int a = 2, b = 3;

	if (a > b)
		goto aa;
	
	printf("hello1\r\n");
	aa:printf("s\r\n");//注意aa的位置
	printf("hello2\r\n");

	return 0;
}

此时的输出结果是:hello1回车s回车hello2回车

解释:这里就很奇怪了,其实一开始我也是觉得设计这样的方式不是很友好,但后来仔细想了一下,还是挺合理的。由于a > b条件不成立,所以不会执行goto aa,所以,接着执行printf("hello1\r\n"),由于C语言是面向过程的,这里紧接着顺序执行aa:printf("s\r\n"),再执行printf("hello2\r\n")和return 0,程序结束

个人总结

通过以上写法对比,发现goto语句有时候很方便,但是有时候却有点难以理解,但这并不能成为goto语句被摒弃的原因把,选择最合适自己的语法才是最正确的。譬如嵌入式开发工程师可能就会使用到goto语句,因为他们会比常规程序员多接触到汇编语言,刚好goto语句和有汇编的思想,为什么不用呢?