如题。
特别是在需要 return 的函数里面,真 TM 爽!
如题。
特别是在需要 return 的函数里面,真 TM 爽!
|
AkiyuJun 6, 2018
1
不懂什么意思, 直接在 do while 里面写 false
不就和没有写循环控制语句一样么 |
|
rootxJun 6, 2018 via iPhone
2
怎么个爽法
|
|
jjianwen68Jun 6, 2018
4
没明白好处
|
|
opengpsJun 6, 2018
5
我也没看懂,需要跳出时候跟直接 return 有啥区别?
|
|
ysc3839Jun 6, 2018 via Android
6
第一次见这种用法好像是在微软的代码里?因为返回之前要释放一些资源,所以不能直接 return。
也有不用这种写法直接用 goto 的,但是 goto 只有 C/C++ 可以用。 |
|
7
一般是 用在宏里面吧?
|
|
8
是不是这个意思
do{ blockA if(...){ break; } blockB }while(false) blockC blockA 执行后满足某条件则不执行 blockB,直接执行 blockC,类似于 goto 的作用 |
|
kranJun 6, 2018 via iPhone
9
解决代码嵌套很管用
|
|
c3824363Jun 6, 2018
10
goto 就挺好
有些语言自以为去掉 goto 就不会产生非常混乱的代码了 |
|
wplctJun 6, 2018
11
为啥不再定义个方法?
|
|
grantonzhuangJun 6, 2018 via Android
12
@remarrexxar 大 js 的立即执行函数也可以这么搞😂
|
|
ryd994Jun 6, 2018 via Android
13
所以啊,实际上 goto 该用还是得用
而且你这样也只能考虑一种 bailout 实际上还会遇到多层嵌套的情况,比如到一半的时候拿了 xx 锁,过了一会又拿了 yy 内存。如果只有一层 bailout 的话就只能在出口判断自己要不要释放。 有 goto 的话加一个 cleanup xx 的 label 就好 |
|
zhuangzhuang1988Jun 6, 2018
14
有好看的异常不用 用这货。
|
|
ryd994Jun 6, 2018 via Android
15
等等,没有 goto 的语言一般是有 throw catch exception 的。用 exception 来代替的好处是,可以不用一层层检查返回值,直接扔给上层。用 goto 退的话,你还是跑不掉要检查返回
|
|
reselfJun 6, 2018
16
看是啥语言。貌似还能对付宏定义的问题
|
|
MittJun 6, 2018 via iPhone
17
@zhuangzhuang1988 异常代价高啊
|
|
notreamiJun 6, 2018
18
想不明白,什么场景非要这样写,大部分语言都有对应的跳出当前代码块
|
|
cuzfinalJun 6, 2018
19
菜鸡前端无法理解
|
|
jiang42Jun 6, 2018 via iPhone
20
C 里头宏的一种惯用法
|
|
xiangyuecnJun 6, 2018
21
前端后端习惯性使用 while(true){........; break;}, 你这个少 3 个字符, 算你牛
套一层之后的最大好处是,不支持 goto、break 的代码段,可以随意 break 跳出去(滑稽 |
|
22
return early 的一种写法, 多个 return 会使代码变得混乱, 通过 do while 进行流程控制可以 做到一个入口 一个出口. 而且可以避免 if else 嵌套 阻止箭头形代码的形成. 好处多的数不过来 大家了解一下吧
|
|
LorenJun 6, 2018 via Android
23
C 语言的宏里也常用
|
|
bumzJun 6, 2018
24
```
a(); do { b(); if (c()) break; d(); } while (false); e(); ``` 等价于 ``` a(); b(); if (!c()) { d(); } e(); ``` 但前者更令人费解 |
|
hsuanJun 6, 2018 via Android
25
C 里非常常见的写法,居然这么多人不知道?看来 C 真是没落了。
|
|
VDimosJun 6, 2018 via Android
26
让我想起了 react 里面的用抛出错误的方式中断,有种异曲同工之妙
|
|
27
在古老的 C 技巧中常常用来写在宏里当作简单而正确的的 inline (比如 linux 内核中)
若是如楼上所说用作 break,那一般是编码有问题,应该试着把其中内容封装成一个函数。装成函数还能有利于单元测试。 |
|
iceheartJun 6, 2018 via Android
28
直接用 lambda 会更爽
|
|
fuxiuyinJun 7, 2018 via iPhone
29
这算是 goto 吧
|
|
takeoffyoungJun 7, 2018
30
@ysc3839 golang 的 defer 就是为这个需求量身定做
|
|
mon6912640Jun 7, 2018 via Android
31
感谢,学到了一个实用技巧,真是巧妙
|
|
redsonicJun 7, 2018
32
竟然这么多人不知道,记得是内核开发面试必问的一道题。。
|
|
FrankFang128Jun 7, 2018
33
还不如 goto 好读……
|
|
guanhui07Jun 7, 2018
34
虽然我也喜欢用 goto ,很多企业 不会让用 goto 吧 -
|
|
wanderpoetJun 7, 2018 via iPhone
35
对于 goto 的因噎废食真是够了 滥用当然不行 但也没必要一刀切的禁用 goto
|
|
36
@xiangyuecn JS 有可读性更好的方法……
// Using a labeled block with break foo: { console.log('face'); break foo; console.log('this will not be executed'); } console.log('swap'); // this will log: // "face" // "swap |
|
ytlmJun 7, 2018
37
在某些情况下这种写法还是比较有用处的
|
|
grewerJun 7, 2018
38
在 do 里面的 break 相当于一个匿名函数的 return
|
|
dychenyiJun 7, 2018
39
@LevineChen 对的, 这种函数开始是初始化,最后是析构,释放内存的代码,如果写 return,相当于每一个 return 前都要释放
|
|
xiangyuecnJun 7, 2018
41
@DOLLOR #36 第一次见到这个语法 只知道 for while 可以用标签 js 果然厉害 学习了
|
|
twotigerJun 7, 2018
42
class MyException(Exception):
pass try: print('a1') raise MyException() print('a2') except MyException: pass print('a3') 那么在 python 里面是这种写法么? 还是经验太少了,没发现有什么亮点 |
|
stackexplodeJun 7, 2018
43
这么经典的安全资源释放方法居然那么多人不知道,还批判了起来
|
|
dbpeJun 7, 2018
44
不是很理解...中午去跟一下...
|
|
45
@twotiger 这个本来就不是一个 exception。。还有 exception 有性能问题吧? java 中有。不知道 python 中有没有。
|