关于goto
2024-09-08 15:51:11
(下面一段来源《征服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,往往会达到事半功倍的效果。
最新文章
- php将对象数组转成普通数组
- 如何对于几百行SQL语句进行优化?
- html5 notification桌面提醒功能
- IOS第12天(4,作业弹出键盘上加上(xib)view的处理,时间选择,代理模式使用,键盘的监听 )
- shell更改目录编码
- Archlinux 添加无线网络
- Silverlight项目笔记8:层次布局、客户端读取shp、ExecuteCountAsync、柱状图、url传参
- ThinkPHP讲解(二)控制器
- MAC 下用GCC编译报错:“Undefined symbols for architecture x86_64: ”
- Linux下面如何安装Django
- Cocos2d-android (03) 向量
- C++转义字符使用
- Angular - - ngCloak、ngController、ngInit、ngModel
- 自制简易Linux系统
- python自动生成excel报表
- (译)Web是如何工作的(3):HTTP&;REST
- 【算法】Normalization
- C语言复习6_doWhile循环
- 20165328 实验四《Andriid应用开发》实验报告
- 不同应用共享redis应用,但分数据库存储数据
热门文章
- 解决ftp登录问题:500 OOPS: cannot change directory:/home/xxx 500 OOPS: child died
- 跟我一起写 Makefile(四)
- 了解cookie和storage的区别及优缺点
- @Valid和@Validated 区别
- 内网隧道与SOCKS代理思路总结
- 【LeetCode】88. 合并两个有序数组
- kvm虚拟化的qcow2磁盘格式的扩容方法
- docker安装完权限问题
- NOIP 模拟 $31\; \rm Game$
- SpringBoot开启异步方法