(下面一段来源《征服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,往往会达到事半功倍的效果。

最新文章

  1. php将对象数组转成普通数组
  2. 如何对于几百行SQL语句进行优化?
  3. html5 notification桌面提醒功能
  4. IOS第12天(4,作业弹出键盘上加上(xib)view的处理,时间选择,代理模式使用,键盘的监听 )
  5. shell更改目录编码
  6. Archlinux 添加无线网络
  7. Silverlight项目笔记8:层次布局、客户端读取shp、ExecuteCountAsync、柱状图、url传参
  8. ThinkPHP讲解(二)控制器
  9. MAC 下用GCC编译报错:“Undefined symbols for architecture x86_64: ”
  10. Linux下面如何安装Django
  11. Cocos2d-android (03) 向量
  12. C++转义字符使用
  13. Angular - - ngCloak、ngController、ngInit、ngModel
  14. 自制简易Linux系统
  15. python自动生成excel报表
  16. (译)Web是如何工作的(3):HTTP&amp;REST
  17. 【算法】Normalization
  18. C语言复习6_doWhile循环
  19. 20165328 实验四《Andriid应用开发》实验报告
  20. 不同应用共享redis应用,但分数据库存储数据

热门文章

  1. 解决ftp登录问题:500 OOPS: cannot change directory:/home/xxx 500 OOPS: child died
  2. 跟我一起写 Makefile(四)
  3. 了解cookie和storage的区别及优缺点
  4. @Valid和@Validated 区别
  5. 内网隧道与SOCKS代理思路总结
  6. 【LeetCode】88. 合并两个有序数组
  7. kvm虚拟化的qcow2磁盘格式的扩容方法
  8. docker安装完权限问题
  9. NOIP 模拟 $31\; \rm Game$
  10. SpringBoot开启异步方法