C 中使用 goto 会被打吗?

2018-11-28 19:21:30 +08:00
 codechaser

突发奇想,C 中的 goto 和我以前学的单片机里的汇编跳转好像,感觉很强大啊。假如大型项目里使用 goto 会被打吗?

11283 次点击
所在节点    C
102 条回复
besto
2018-11-29 09:49:31 +08:00
@across
@VDimos 读读 kernel code, goto 就是满天飞.


这个问题应该分情况讨论. 做 cleanup, 时推荐使用; 跳出多重循环时, 可以使用, 但最好别用; goto 当作循环任何时候都应该禁止, 尤其在 goto 到循环里的情况(当然这种情况有特例)
yulitian888
2018-11-29 10:11:45 +08:00
不准用 goto,就跟驾校里“发动机 2000 转换挡”一样,是半吊子教练忽悠学员的说辞。
如果 goto 真的那么邪恶,后面发展起来的高级语言像 java,c#什么的,还留着丫干嘛呢?
robot777
2018-11-29 10:20:09 +08:00
个人喜欢 goto 逻辑复杂实时比较简洁,不过一个函数里面也就用一次,怕把自己绕进去
absente
2018-11-29 10:30:46 +08:00
同理可证,代码里用中文并不会被打
swananan
2018-11-29 10:32:42 +08:00
goto 不要往回跳
xwander
2018-11-29 10:50:45 +08:00
@swananan 赞同。

if ···
goto exit;
·
·
·
exit:
free(A);
free(B);
free(C);

可以统一地写一个退出操作,用 goto 跳到后面
bwangel
2018-11-29 10:50:50 +08:00
goto 的原则是可以向下跳,但是不能向上跳。函数中处理错误,用 goto 就 像 Python 中的 try: ... Except e: ... 读起来也是很清晰的。
SPACELAN
2018-11-29 11:15:14 +08:00
用来跳过 block 块或者做退出处理还是蛮好用的

用 goto 做循环的确会被打
deadEgg
2018-11-29 11:50:43 +08:00
形成 goto 方法的思维定势就行,写完后都能理解 goto 写法就行。

开发规范+1
realpg
2018-11-29 12:07:29 +08:00
goto 是个好东西
前提是你用得好 用的合理 不要弄乱套

之所以禁止 goto 主要是用不好的人 就会写出难以维护的代码 考虑到得失相关 所以很多地方规范是不让用 goto


个人经验 goto 一般可以用于以下场合

1. 短距离跳转 上下 5 行内 目的标签跟 goto 一一对应 不存在一对多或者多对一

2. 向下跳出代码块

3. 类似高级语言异常处理的用法 结束本方法之前的收尾工作

4. 特定小循环(一般也匹配 1 )
wdv2ly
2018-11-29 12:11:02 +08:00
千万别,goto 就像毒品,一旦用了就停不下来了 doge
liuxu
2018-11-29 12:18:44 +08:00
@codechaser

其实已经搜出来了,你需要点击“ Code ”,或者“ goto repo:torvalds/linux extension:c ”
kkhaike
2018-11-29 13:21:00 +08:00
我感觉 goto 只有一种情况 c 下的错误处理
passerbytiny
2018-11-29 13:42:10 +08:00
@yulitian888 #61 不好意思,Java 里面 goto 是“不可用关键字”,你要敢用,就是编译错误。
syntaxsugar
2018-11-29 13:46:59 +08:00
grewer
2018-11-29 13:50:53 +08:00
您好,会的
akakcolin
2018-11-29 13:56:19 +08:00
没事的,只用 goto 来做错误处理
比如这样:if(SUCCESS != (ret = mfunc(ctx, &ct))) goto err;
其他时候也不需要
zwh2698
2018-11-29 13:59:28 +08:00
请看驱动内核,大量的 goto 存在,只是理由要充分
huadi
2018-11-29 13:59:54 +08:00
@yulitian888 你说应该多少转换挡?
codechaser
2018-11-29 14:16:09 +08:00
@zwh2698 最近刚开始认真学习 C,还不敢看这么高端的东西,也不知道从哪儿看,不能好高骛远。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/512453

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX