(下面一段来源《征服C指针》)

75: ReadLineStatus read_line(FILE *fp, char **line)
76: {
77: int ch;
78: ReadLineStatus status = READ_LINE_SUCCESS;
79:
80: st_current_used_size = 0;
81: while ((ch = getc(fp)) != EOF) {
82: if (ch == '\n') {
83: status = add_character('\0');
84: if (status != READ_LINE_SUCCESS)
85: goto FUNC_END;
86: break;
87: }
88: status = add_character(ch);
89: if (status != READ_LINE_SUCCESS)
90: goto FUNC_END;
91: }
92: if (ch == EOF) {
93: if (st_current_used_size > 0) {
94: /*如果最终行后面没有换行*/
95: status=add_character('\0');
96: if (status != READ_LINE_SUCCESS){
97: goto FUNC_END;
98: } else {
99: status = READ_LINE_EOF;
100: goto FUNC_END;
101: }
102: }
103:
104: line = malloc(sizeof(char) st_current_used_size);
105: if (*line == NULL) {
106: status = READ_LINE_OUT_OF_MEMORY;
107: goto FUNC_END;
108: }
109: strcpy(*line, st_line_buffer);
110:
111: FUNC_END:
112: if (status != READ_LINE_SUCCESS && status !=READ_LINE_EOF) {
113: free_buffer();
114: }
115: return status;
116: }

goto常见的几个场合:

1.异常处理(如上)

2.跳出多重循环:

int i,j,k;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
for(k=0;k<n;k++){
if(a[i][j][k]==0)goto label;
}
}
}
label:
printf("%d %d %d",i,j,k);

如果不用goto,结果将会变成:

int i,j,k;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
for(k=0;k<n;k++){
if(a[i][j][k]==0)break;
}
if(a[i][j][k]==0)break;
}
if(a[i][j][k]==0)break;
}
printf("%d %d %d",i,j,k);

总体说,goto不是不能用,而是要分清场合使用。如果写出这段代码:

a:
if(flag)goto b;
else goto c;
func1(); b:
if(flag2)goto a;
else goto c; c:
func2();func3();
flag2=0;goto d;

这样一段乱七八糟的代码,估计没有人想看吧。这就是乱用goto的例子。

不能乱用goto,不代表不能使用goto。在适当的场合使用goto,往往会达到事半功倍的效果。

关于goto的更多相关文章

  1. 因为没用过,所以没想过的--goto

    今天读了读 Rui Maciel 大神写的 mjson parser,mjson 解析器是一个使用 ISO C 实现的小型 JSON 解析器.嵌入式项目中使用到了该解析器,随即拿出来看看. 看到如下代 ...

  2. bat脚本参数 if goto choice for使用的学习笔记。

    写过几次bat脚本,但一直没有总结,最近找到一个网页介绍bat,总结得很好,转自 http://www.jb51.net/article/49627.htm: 本文只总结我不会的,全面的看原网页就可以 ...

  3. 用goto做异常处理

    http://www.cnblogs.com/trying/archive/2012/06/25/2863753.html 今天在CSDN上看到的关于错误返回值的讨论,感觉非常有趣. 从中可以看出被教 ...

  4. 尽量用goto代替尾递归

    void PrintList(List L) { if(L!=Null) { PrintElement(L->Element); PrintLisr(L->Next); } } 所谓尾递归 ...

  5. C++:为什么说 goto 没有用

    要了解一个功能有没有用,首先应该分析它能实现的所有功能. goto 可以实现的功能只有两种:一,向前面跳:二,向后面跳.这两种情况对应三种功能:一,重复执行也就是循环:二,跳过一段代码也就是条件判断: ...

  6. C语言的傻瓜式随笔(二):全局变量、预编译、goto

    函数的作用:可以实现代码的重用. 函数只需要定义1次,那么函数中的代码就可以随意的调用.       -某不知出处的基本概念 学而时习之,如有误笔,请指正 一.goto跳转语句 goto在C语言的作用 ...

  7. GOTO Berlin: Web API设计原则

    在邮件列表和讨论区中有很多与REST和Web API相关的讨论,下面仅是我个人对这些问题的一些见解,并没有绝对的真理,InnoQ的首席顾问Oliver Wolf在GOTO Berlin大会上开始自己的 ...

  8. How To Use Goto?

    看到,网上很多人对于goto的询问, 因为本身在工作中经常使用到,所以写下此文, 如有错误, 请指出. 本人写博文的时候主要从事C++工作 对于goto的态度,本人目前成长如下: 学生时代 老师课堂上 ...

  9. 辗转相除法求最大公约数,非goto

    #include<iostream> using namespace std; //不推荐用goto,当然用它更快 //辗转相除法求两数的最大公约数 int gcd(long int a, ...

  10. C语言字符串匹配、goto语句、关机命令使用

    1.程序执行修改窗口字体颜色命令: 2.程序执行修改窗口标题命令: 3.程序执行关机倒计时命令: 4.根据提示输入团队名称JYHACK TEAM 根据提示输入团队网址:http://bbs.jyhac ...

随机推荐

  1. Linux平台上转换文件编码

    Linux系统的iconv指令是一个很好的文件编码转换工具,支持的编码范围广,使用方便,例如将一个utf-8编码的文件(名为tic)转换为gbk编码: iconv -f utf-8 -t gbk ti ...

  2. 一篇文章搞懂密码学基础及SSL/TLS协议

    SSL协议是现代网络通信中重要的一环,它提供了传输层上的数据安全.为了方便大家的理解,本文将先从加密学的基础知识入手,然后展开对SSL协议原理.流程以及一些重要的特性的详解,最后会扩展介绍一下国密SS ...

  3. Sqli-Labs less26-28a

    less-26 从第26关开始,我的sqli-labs就在docker上运行了,因为windows中阿帕奇对空格的转义有问题 通过源码可以看到有很多过滤,包括空格 or和and. 方法: or可以用| ...

  4. .NET第三方补丁工具(Visual Patch)常用手册

    SetupFactory简介 这是Indigo Rose(蓝玫瑰)公司开发的一套打包-补丁解决方案的补丁工具,相比Setup Factory,他的知名度似乎不太高,网上也很少找到相关资料,但是真的很简 ...

  5. 题解—P3000 [USACO10DEC]Cow Calisthenics G

    做这题之前最好学会 "树形 \(dp\) 求树的直径"这一前缀知识(虽然我会但是我还是没想出来) 几乎想到要求直径这道题也没什么问题了(这不是废话吗,为什么题面里给了"直 ...

  6. asp.net MVC 的路由匹配

  7. 八:Filter(过滤器)

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  8. 连接共享打印机失败错误代码0x80070035

    局域网内共享打印机非常方便,但是在连接中经常遇到问题,其中出现错误代码0x80070035的概率非常之高! 1.必须确保有关打印功能的相关服务都处于自动启动状态,重点检查TCP/IP NetBIOS ...

  9. OJ 注意事项

    1,检查指针是否有效,即是否为NULL 1 void OutputMaxAndMin(int * pInputInteger, int InputNum, int * pMaxValue, int * ...

  10. MySQL 事务和锁

    1. 事务 1.1 什么是事务? 1.2 事务的特性:ACID 1.3 事务语句 1.4 事务的隔离级别 1.5 锁 1.6 事务隔离解决并发问题 2. 死锁 2.1 场景示例 2.2 死锁调优 3. ...