谈个找喷的话题,我喜爱goto语句。。。。

中山野鬼 发布于 2012/05/23 16:24
阅读 2K+
收藏 2

很多教科书说,C语言里面的GOTO是个老古董,不符合编程规范,应该抛弃和回避。

我只能说,写这些教科书的人,真没什么工程经验。

GOTO属于单跳转,不存在两个可行的分支。

或者绝对跳转。区别 if ,while ,for ,等,差异在于没有比较。

其实和GOTO类似的还有:

break ,continue ,call(这个对于纯软C程序员可能很少简单,但实际在每个函数调用时都发生), return。

上面特别是break ,continue,教科书不BS,反倒goto语句被鄙视。

多的不说,谈谈goto 比 break的优势

break只能在当前循环层。而goto可以在任意地方。特别适合代码分支聚焦。例如,多个不同段的位置,同时转移到同一个代码段的位置。

break看似跳转位置固定,更符合程序设计规范,但成也他,败也他。我不知道大家有没有见过一个while里面超过千行的代码。我见过,真的变态。或者一个while里面套了超过5个 以上的while的,我见过,也真变态,(最后全部拆成子函数折腾了,代价是多了一堆子函数之间的临时变量共享的额外操作,你没见过只能说你没见过复杂逻辑的设计)。这个时候,你找这个break跳哪,下个break跳哪,哈。。。。很惨。难道所谓的“教科书”的程序设计规范,就是让我们很难理解代码吗?

这里说下哪些情况用GOTO。

不谈任何涉及堆栈段需要调整的跳转,例如longjmp ,call ,return。

如果你对函数的逻辑抽象出来,发现,存在一个不可逾越的代码段,是必须要执行的,而前期存在各种分支情况,也即多分支的最终均会到达相同代码段,此时goto就有存在的理由。

C里的goto和C一样,如果哪天C语言被淘汰了,那么同样的理由,我们足以淘汰C语言里的GOTO。哈。。。。很悖论,既然C都淘汰了,C里的GOTO还有讨论的必要吗?

 

加载中
1
J
Jplus

引用来自“中山野鬼”的答案

引用来自“name=天天”的答案

首先喷goto的不是教科书,而是国外的一个大牛,因而成为了开发的规范
我怀疑这个大牛是否写过OS之类的东西。某非longjmp他也打算喷?没有goto的设计思维,longjmp很难理解。
该牛人您就别碰啦, http://baike.baidu.com/view/809651.htmDijkstra是设计OS的鼻祖。
0
bastetwang
bastetwang
什么东东都有优点和缺点,以优点来否定所有的缺点...或者以缺点来否定所有的优点,楼主对乱用goto造成的问题就选择性失明,装做没看到了。
0
bastetwang
bastetwang

这种喷有啥意思呢,喷完正面再写一篇文章,只写他的缺点,就再喷一遍。

这跟网上常见的:

不应该使用XX的十个理由

应该使用XX的十个理由

又有啥大区别呢。

不过楼主是能凭一个url就能喷一堆的,我也没话可说。

0
bastetwang
bastetwang

其实楼主想表达的意思我想也不是喜欢goto语言,更准确的表示可能是:

有些情况下用goto更方便

这个意思而已,

楼主夸大的言辞,耸人听闻的标题,英文的断句,佩服。

0
中山野鬼
中山野鬼

引用来自“bastetwang”的答案

什么东东都有优点和缺点,以优点来否定所有的缺点...或者以缺点来否定所有的优点,楼主对乱用goto造成的问题就选择性失明,装做没看到了。
哈。乱用if 一样会造成问题。如果认为乱有会导致问题,而否定其存在价值,貌似什么都不能用。因为什么都可以乱用。
bastetwang
bastetwang
是啊,这就是你的逻辑了。
0
Monkey
Monkey
goto在某些时刻是极品,非常的极品,特别是一些算法中,goto绝对相当的好用。很多加密算法没有goto做起来就异常痛苦。实际上还没有一个关键字可以替代goto,有些到处goto的算法用java这种没有goto的语言实现起来就像是自残。
0
中山野鬼
中山野鬼

引用来自“bastetwang”的答案

这种喷有啥意思呢,喷完正面再写一篇文章,只写他的缺点,就再喷一遍。

这跟网上常见的:

不应该使用XX的十个理由

应该使用XX的十个理由

又有啥大区别呢。

不过楼主是能凭一个url就能喷一堆的,我也没话可说。

非也。。。。不使用什么的十大理由,只是在防止错误的使用,但这并不是拒绝使用的充分条件,而是不使用的必要条件。我这个帖子只是强调使用的必要条件。也就是存在的必要性。

如果我要喷goto,那么也只会喷滥用。任何事物只有特点,而没有天生的缺点优点。优缺点是主观的判断而已。在没有实际情况下,就贸然说缺点优点就很无聊了。如同谈C和 C++哪个更好一样没有意义。

你在讲如何谈论一个事物的优缺点和讨论一个事物存在的必要性两个问题混为一谈。我只讨论了后者,没有讨论前者。

中山野鬼
中山野鬼
回复 @Jack.arain : 哈哈。不讨论。。。OSC不就成政府门户网站了吗?
Jackarain
Jackarain
回复 @bastetwang : 我在OSC变成愤青, 就是因为野鬼发太多炒作主题帖子, 凤姐还说自己在五百强企业工作呢.
Jackarain
Jackarain
回复 @中山野鬼 : 那你找些代码举一些恰当的例子不行吗? 非要像凤姐那样, 找个反常人的理由, 吸引大家眼球吗?
bastetwang
bastetwang
回复 @中山野鬼 : 嗯,楼主又改了,因为楼主做底层开发(到底啥底层我也不知道,虽然我也写过驱动啥啥的),所以他得用goto,但是他也得教育你!!
中山野鬼
中山野鬼
回复 @Jack.arain : 我和你们的工作不同。我主要开发底层模块的。我存在大量需要使用goto的地方,当然这些模块注定更需要C语言来实现。准确说,用C语言实现某类问题,经常存在goto的使用。学习C而回避goto,反倒让这写学习者在回避一些使用C更恰当的开发场景。
下一页
0
bastetwang
bastetwang

网上喷得最多的话题也类似:

特别是有关语言啦,

数据库啦。

因为不管什么人,哪怕刚入门的,都会来根据自己的使用来喷一喷,

这就有了那个著名的故事:

一堆穷程序员晚上抢劫一路过少女,少女灵机一动,问他们:什么语言最好。

程序员就开始互喷,少女就走了。

冬日暖阳85
冬日暖阳85
我认为Java最好,没有之一。
Jackarain
Jackarain
哈哈, 这个比这个帖子有意义多了, 简直是中心思想...
0
中山野鬼
中山野鬼

引用来自“bastetwang”的答案

其实楼主想表达的意思我想也不是喜欢goto语言,更准确的表示可能是:

有些情况下用goto更方便

这个意思而已,

楼主夸大的言辞,耸人听闻的标题,英文的断句,佩服。

我想表达的意思是,C语言里,有些情况必须使用goto语句,这样更符合编程规范。而不是刻意回避goto,使用别的语法方式来实现。

形式主义和绝对主义害死人。例如学校的老师,禁止学生在C代码里放goto,或许理由是,这个是C语言的一个遗老,规范的方式应该禁止使用(这个论点是错误的)。或例如公司,资格老的代码员,仍然使用同样的理由。

这里我强调的是goto存在的必要性,由此直接反驳那些禁止全面使用goto的言论。

bastetwang
bastetwang
回复 @中山野鬼 : 你已经喜欢goto语句了,我们没啥想法了。
中山野鬼
中山野鬼
回复 @bastetwang : 谈不上教育,我不是老师,没这个资格。放个道理在那,大家要不要,看大家自己的想法。
bastetwang
bastetwang
只是希望年轻的程序员多思考一个工具存在的价值,而不要被“禁止使用”“一定该用”这种断语而约束。 楼主我懂了,你不是找喷的,您是来教育大家的对吧?
bastetwang
bastetwang
回复 @Jack.arain : 我也是,不过我觉得要是说服不过人家就说自己是老资格,想说自己的资历多丰富,什么想教育人家的口吻,我就不太习惯。
bastetwang
bastetwang
回复 @中山野鬼 : 难道是我看错了,你的标题是:我爱goto,而不是你说的被啥误导误导啥的吧。
下一页
0
周翼翼
周翼翼

我向来说,小倩的话,饿着的人要饿着听.

你说的误导的作用大于指导.

goto不被提倡,是因为基本没有必须要用goto的情况,goto的存在,是因为jmp的存在.

所有必须用goto的地方,都应该重新设计.

1000行的while,你去屎吧~~

bastetwang
bastetwang
楼主只是为喷而喷。别当真,
返回顶部
顶部