(下面一段来源《征服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. [C++]-unordered_map 映射

    unordered_map和map的区别请点击这里. 本文中的代码跟[C++]-map 映射中的代码仅仅是把定义的map类型数据定义成了unordered_map类型数据. 代码 #include&l ...

  2. linux虚拟机环境快速搭建redis5.x版本的主从集群总结

    文/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建,但时间久了,都快忘记当时的搭建过程了,故而决定在虚拟机centOS 7的环境,自行搭建一套redis5.x版本的集群,该版本集群的搭建比 ...

  3. 【笔记】sklearn中的SVM以及使用多项式特征以及核函数

    sklearn中的SVM以及使用多项式特征以及核函数 sklearn中的SVM的使用 SVM的理论部分 需要注意的是,使用SVM算法,和KNN算法一样,都是需要做数据标准化的处理才可以,因为不同尺度的 ...

  4. 玩转 pyocd

    (一) pyocd (1) 什么是pyocd ​ pyocd 是 arm 开发的一个 python 包(python package),该软件包可以使用多种USB调试器对 arm cortex-M 微 ...

  5. sqli-labs 16-20

    less 16: 和less 15基本一致,只是对参数进行了 ") 的包裹,注意闭合语句使用延时注入即可. 下面给一个payload示例: uname=admin")and if( ...

  6. Oracle11 创建表空间、创建角色及导入

    针对日常工作中经常使用命令创建表空间,导入数据,特此记录下(windows环境下),记录中的testSpaceName是表空间名称,testUserName是用户名,userPwd 是用户密码. 1. ...

  7. SpringBoot快速入门(一)

    本文内容 SpringBoot概述 SpringBoot快速入门 SpringBoot起步依赖原理分析 SpringBoot配置 SpringBoot整合其他框架 1.SpringBoot概述 1.1 ...

  8. 【协议】AAA Radius协议的常用报文分析

    写在前面的话 RADIUS:Remote Authentication Dial In User Service,远程用户拨号认证系统由RFC2865,RFC2866定义,是应用最广泛的AAA协议. ...

  9. Qt多窗口编程详解

    常用的窗体基类是 QWidget.QDialog 和 QMainWindow,在创建 GUI 应用程序时选择窗体基类就是从这 3 个类中选择. QWidget 直接继承于 QObject,是 QDia ...

  10. C#多线程---I/O线程实现异步请求

    一.场景 利用I/O线程来模拟浏览器对服务器请求的异步操作. 二.例子 1 using System; 2 using System.Collections.Generic; 3 using Syst ...