最近由于部分项目使用到了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语句和有汇编的思想,为什么不用呢?