c语言 goto用法,C goto 用法详解

2.goto分析:

1).goto是干啥的?

c语言提供了可随意滥用的goto语句以及标记跳转位置的标号.但是理论上goto是没有必要的.

标记跳转位置的标号: 如上例中的 _failed: , _failed_fd:, 标号可以在该函数的任意地方,在标号后边,写处理逻辑。

调用goto语句语法: “goto 标号;"

2)测试代码:

复制代码

#include

#include

int

main(int argc, char *argv[])

{

int a = atoi(argv[1]);

if (a == 1)

{

goto failed1;

}

else if(a == 2)

{

goto failed2;

}

else

{

goto failed3;

}

failed1:

printf("get failed1\n");

failed2:

printf("get failed2\n");

failed3:

printf("get failed3\n");

printf("a + b = 3\n"); (随便输出的)

return 0;

}

复制代码

代码从控制台输入a的值,下面分别是 a = 1, 2, 3时的结果,编译:gcc -g -o test test.c

控制台输入: ./test 1

结果:

get failed1

get failed2

get failed3

a + b = 3

控制台输入: ./test 2

结果:

get failed2

get failed3

a + b = 3

控制台输入: ./test 3

结果:

get failed3

a + b = 3

可以看到,运行到对应的标号后,程序是继续向下运行的。

修改代码:

将 _failed1:的代码搬到 if(a == 1) 上边,同时修改a的值:

复制代码

#include

#include

int

main(int argc, char *argv[])

{

int a = atoi(argv[1]);

failed1:

printf("get failed1\n");

a = 3;

if (a == 1)

{

printf("a = 1\n");

goto failed1;

}

else if(a == 2)

{

goto failed2;

}

else

{

goto failed3;

}

failed2:

printf("get failed2\n");

failed3:

printf("get failed3\n");

printf("a + b = 3\n");

return 0;

}

复制代码

当再次编译代码,并运行:

./test 1

输出结果:

get failed1

get failed3

a + b = 3

可以看出,标号仅仅起到一个标识作用,程序顺序执行时,标号仿佛不存在,首先输出get failed1, 然后修改 a = 3,.并不是只有调用了goto标号,然后程序调到标号处,从而触发标号下边的代码开始运行。而是可以看作在完整的代码中插入标号,从而单纯地引导goto到达的位置。

3)为什么不推荐使用goto:

一般认为goto的使用会造成代码难以理解和维护,ps:因为我用的较少,对此理解还不是很深刻。

4)什么情况下用到goto:

当程序有多层嵌套,当处在嵌套内的逻辑判断为真或为假时,需要彻底或者连续跳出几层循环时,一般考虑使用goto,因为break一次只能跳出一层,并且需要跳出多层循环时需要假如更多的判断逻辑,

这种情况下,会考虑使用goto,还有就是在大型程序中处理复杂逻辑时,一般也会考虑使用goto。

例如判断两个数组中是否有相同元素时:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言之基础 1) C语言之简介 2) C语言之搭建开发环境 3) C语言之第一个简单程序的结构详解 4) C语言之书写规范和注释 5) C语言之数据类型 字符串和格式化输入输出 6) C语言之使用字符串 7) C语言之格式化输出 8) C语言之格式化输入 9) C语言之格式化输入输出整理 10) C语言之基本运算符 11) C语言之其他运算符 12) C语言之表达式和语句 循环语句 13) C语言之while循环语句 14) C语言之do-while循环语句 15) C语言之for循环语句 16) C语言之使用关系运算符和表达式 17) C语言之赋值运算+=、-=、*=、/=、%= 18) C语言之循环嵌套 分支跳转 19) C语言之分支和跳转 if 20) C语言之分支和跳转 if-else 21) C语言之条件运算符 ?: 22) C语言之循环辅助手段:continue 和 break 23) C语言之分支和跳转 switch和break 24) C语言之分支和跳转 goto语句 25) C语言之字符输入/输出和输入确认 指针 26) C语言之初识指针 27) C语言之指针的简单用法 28) C语言之字符串指针详解 数组 29) C语言之定义数组 30) C语言之一维数组的使用 31) C语言之二维数组和多维数组 32) C语言之指向数组的指针 33) C语言之保护数组内容const的使用 34) C语言之指向多维数组的指针 函数 35) C语言之函数的定义和调用 36) C语言之定义带参数的函数 37) C语言之函数之形参和实参 38) C语言之函数之返回值和函数类型 39) C语言之指针做函数参数 40) C语言之数组做函数参数 41)c语言之递归 字符串和字符串函数 42)c语言之字符串I/O 43) C语言之字符串输入/输出 44) C语言之字符串处理函数 文件操作 45) C语言之文件是什么 46) C语言之用fopen() 打开文件,关闭文件 fclose() 47) C语言之getc() 和 putc 读写文件 48) C语言之文件结尾 49) C语言之fgets() 和 fputs() 50) C语言之文件内部指针 51) C语言之rewind() 52) C语言之随机存取 fseek() 和 ftell() 函数 53) C语言之fsetpos和fgetpos 54) C语言之fread() 和 fwrite() 函数 结构体和其他数据形式 55) C语言之结构体的定义和初始化 56) C语言之访问结构体成员 57) C语言之结构数组 58) C语言之结构体指针 59) C语言之结构体做函数参数 60) C语言之把结构体保存到文件 已更新至此 61)C语言之联合简介 62)C语言之枚举类型 63)C语言之函数和指针 位操作 64) C语言之二进制、位和字节 65)C语言之位运算 66)C语言之打开位 67) C语言之转置位及查看位 68) C语言之左移右移(大结局)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值