有人用 goto 语句么?我是用它代替递归

2017-10-24 16:35:17 +08:00
 me15000

//递归
void repeat(c) {

	
		//需要重复的代码
	

		if (xx) {
			 repeat(xx);
		}

}

//goto 代替递归
void repeat(c) {

	loop:
		//需要重复的代码
	

		if (xx) {
			goto loop;
		}

}


        //一个采集程序
        public void Run(string listurl)
        {
            using (var wc = new WebClient())
            {
                loop:

                string html = Encoding.GetEncoding("utf-8").GetString(wc.DownloadData(listurl));
                var doc = new HtmlDocument();
                doc.LoadHtml(html);
                var nodes = doc.DocumentNode.SelectNodes("//ul[@id=\"data_list\"]/li/div/a");
                for (int i = 0; i < nodes.Count; i++)
                {
                    var node = nodes[i];
                    string link = "http://www..cn" + node.Attributes["href"].Value;
                    string title = node.SelectSingleNode("span[@class=\"sTit\"]").InnerText;
                    Save(title, link);
                }
                var nextnode = doc.DocumentNode.SelectSingleNode("//div[@class='page mb clearfixs']/em/following-sibling::a");
                if (nextnode != null)
                {
                    listurl = "http://www..cn" + nextnode.Attributes["href"].Value;
                    goto loop;
                }
            }
        }
10890 次点击
所在节点    分享发现
128 条回复
noli
2017-10-25 23:19:18 +08:00
@geelaw

我又用错词了,应该说,“不用 goto 就没有这种连初始化个指针都是 ill-formed 的破事儿"。
虽然在你的代码里面 TypeD 是个 struct

但谁也没法阻止 typedef TypeC* TypeD; 对吧

#include <iostream>


int main(int argc, char **argv)
{
if (argc > 0) {
goto PRE_EXIT;
}
int * some_ptr;

// initializing some_ptr will upset the compiler
// int * some_ptr = nullptr;

PRE_EXIT:
std::cerr << argc;
return 0;
}
geelaw
2017-10-25 23:25:26 +08:00
@noli 如果是 POD,你可以把初始化替换为不初始化+赋值啊……这样你就很明确了。
ryd994
2017-10-26 06:22:58 +08:00
@Livid #61 #62 楼主这已经很不礼貌了
问题本身就是很基础的问题,楼下大家的意见也很明确,楼主完全没有在听
我认为这贴已经在浪费大家的时间
建议 /go/chamber
ryd994
2017-10-26 06:34:03 +08:00
@facetest #35 少拿 linux 和 nginx 说事。人家是多年的老程序员的,知道用 goto 意味着什么。规矩都差不多:原则上不允许用 goto,除了(错误处理&不影响可读性)
还有个例外就是 linux 进程调度部分:那部分已经好多年没动过了,现在也没几个人敢动。现在只能修修补补凑合用,等着哪天哪个大牛忍不下去重写
ryd994
2017-10-26 06:44:08 +08:00
@introom #50 初生牛犊不怕虎
绝大多数项目的要求是:goto 仅用于错误处理,且不得影响可读性。禁止 goto 参与主要控制逻辑。
https://stackoverflow.com/questions/46586/goto-still-considered-harmful
这么喜欢 goto,怎么不写汇编去啊
carlclone
2017-10-26 06:57:05 +08:00
楼主连续几个帖子被喷也是不容易,反省一下自己吧不如
me15000
2017-10-26 08:06:09 +08:00
@ryd994
心里仍然有喷你的欲望,不礼貌建立在对方不礼貌的前提下,还有你这种动不动就找人举报的人,不够 man 和上小学幼稚园的小朋友有的一拼,

上面的观点并没有说服我
有人说老程序员这样做,所以就不用,那你其实也不知道为什么

还有人说 nginx 什么里面用来处理错误,所以只用来处理错误时候用 goto,这有点牵强吧?

在我看来仍然可以用,除非这样用很难被普通人理解,或者用了会出现严重 bug

目前最主要的矛盾是:大多数人没这样用过,所以不去用,还有国内初识编程时对 goto 的认知


@carlclone 日心说那家伙还被火烧了呢,帖子里的观点如果有人愿意认真思考的话,没什么道理可言,要么是模仿要么是教条主义
introom
2017-10-26 08:16:57 +08:00
@ryd994 是是是,对对对,初生牛犊,不像你曾经沧海云卷云舒。 我的五十楼的回帖很中肯,也说了 lz 的实例代码使用 goto 不恰当,这样来强喷就没什么意思了。我也希望你指点指点,不过贴一个日经的链接就索然无味了。
chiu
2017-10-26 08:30:47 +08:00
有用 setjump(),longjump()的吗
ragnaroks
2017-10-26 08:31:10 +08:00
@me15000 mshtml.dll?这个最好不要用,或者先自己另外获取了 html 后用字符串生成 htmldocument,ms 自己的那个解析经常出现意外
me15000
2017-10-26 08:34:59 +08:00
@msg7086
说实话我并没有说这是高深的技术,原本觉得这样写蛮有意思,就分享一下,你气势汹汹说人无知,我说你无知,你说你们公司那样,说明你们公司并没有完善的管理机制,你是一个人搞定了没错,但你们公司发展不大,因为只有你一个人可以搞,我觉得也不是什么值得骄傲的事情,我认为任何产品或技术都应该追求简约,而不是需要十几年的积淀才能做好,那对大多数公司来说不划算
me15000
2017-10-26 08:35:36 +08:00
@ragnaroks 我写的控制台程序
me15000
2017-10-26 08:37:30 +08:00
@ragnaroks 不是 ms 是开源的
ragnaroks
2017-10-26 08:45:01 +08:00
@me15000 我看到 new HtmlDocument 以为是萎软 mshtml.dll,我用它做大人站解析的时候动不动无法获取数据或者获取数据途中崩溃,实在没办法用 HAP 才完美
me15000
2017-10-26 08:47:54 +08:00
@noli 又是一枚自认为很厉害的技术,说实话我倒是没感到得意,反而觉得你挺臭屁的
superkeke
2017-10-26 08:52:16 +08:00
有时候会用 goto 来进行错误处理,可以很好的处理内存问题
paulagent
2017-10-26 09:08:44 +08:00
好久没看到引战帖子了
facetest
2017-10-26 09:15:02 +08:00
@ryd994 谁的规矩,是一部分人的规矩还是所有人的规矩?还老程序员知道 goto 意味着什么,意思就是小程序员我若我有理咯。你发的 stackoverflow 里,也摘录了 linus 的话,人家就觉得 goto 挺好。
msg7086
2017-10-26 09:23:37 +08:00
@me15000 气势汹汹?
我花了时间帮你改进了代码还帮你加了功能,这就是你评价别人的态度咯。那我应该评价你啥?恩将仇报吗?

信不信随你,但是我们这比我水平好的人太多太多了。
我们大学操作系统课程大作业是写一个 Linux 的 USB 设备驱动。我在小组里别说写代码了,就连写报告的水平都轮不上。
一个班级毕业出来的人,几乎每一个都比我厉害得多。我 GPA 3.0 毕业,不到 3.0 连毕业文凭都拿不到,我想那些 GPA 超过 3.0 的学霸们那数量肯定是不少了。

一个公司只有我一个人可以搞?那的确不是什么值得骄傲的事情。幸好像我这种水平只是代表程序员这个岗位的最低要求,想要招人,比我厉害的到处都是。之前招的那批程序员都是公司为了省钱从国外招的,什么印度的,乌克兰的,东欧小国的都有,他们就是因为缺乏这种匠人精神才把公司搞垮成这样。老老实实一年十万招点比我水平更好的进来,公司早就上市了也说不定。

你说公司搞不大,那我们谈谈大公司。亚马逊我面过(很可惜人家看不上我这水平),电面 3 道算法题,去公司面试 4 道算法题 2 道设计题,加起来 8-9 轮面试。不说别的,你跟考官说你 BFS / DFS 不会写,只会写递归,而且不知道堆栈溢出是什么玩意,怕是电面都过不了。我那时候第一轮电面是个中国人,起手让我写一个堆排序的类,白板直接手写代码,这要算的话大概是大四或者研究生课程的东西了。

再大点的公司,谷歌?我根本就没敢去面。以前一个小基友是普渡学霸,毕业了跑去谷歌开发某个汽车项目,他给我做过一次简单面试,把我打得满地找牙。不知道你是有多自信才觉得大公司不需要有高技术的人的。

最后,你认为任何产品或技术都应该追求简约而不需要十几年的沉淀?
我只能发一个我不知道该对你做出什么样的表情.jpg 的表情了。
真以为计算机这个行业是看看书看看视频 7 天学成程序员啊。
我跟你说,v2ex 技术出身的人多,你要是讨厌有技术的人,我劝你少来这里,否则总有一天你会被气炸的。
xomix
2017-10-26 09:26:43 +08:00
po 主祭出大杀器就是想让大家活跃些吗?

goto 能不能用?能! 除了 java 这种保留关键字又不实现的语言之外,只要有这个关键字就能用。if goto 是一个在面向过程编程时很常见的语法。

goto 好不好用?这个不好肯定回答,但是用对了一定事半功倍。再好的东西滥用了就变得不好用了。

为什么大一些的项目组尽量禁用 goto ?大项目组禁用的东西很多,约束也很多,主要是为了未来你不再维护这些代码的时候他人来到可以快速上手维护代码,所以牺牲一些效率和代码行数,获得更好的可读性和维护性对他们来说是划算的甚至是最优的。


所以…………个人项目你就是不想写 for 循环写成 goto 也行啊,只要你自己维护的时候别觉得眼晕就行。

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

https://tanronggui.xyz/t/400286

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

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

© 2021 V2EX