问题标签 [goto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
909 浏览

c - 如何使用 goto 在 C 中模拟异常?

我正在用 C 编写并发事务库,发现以下问题。让我们考虑一个示例事务成员伪代码,其中“事务”表示与事务主机的通信通道:

在并发事务中,只有当我们被主人要求投票时,我们才能投票。但是master可以随时调用trans_abort(member),强制指定成员取消事务。成员可以在执行的任何阶段接收到 ABORT 消息,在这种情况下,它不应该等到执行到达trans_ready()调用。例如,如果trans_rcv()在后面的代码中有一个调用,则该进程将一直等待来自 master 的数据,这些数据永远不会发送。

现在,重点。我已经有代码来注册回滚更改的中止函数,但我还希望有一个额外的机制,允许跳过其余的操作并立即跳转到投票代码。我有个想法在这里使用 goto 来模拟异常:

但是,为or的每个调用编写ifs并不是很舒服,尤其是在事务代码很复杂的情况下。您对更好的解决方案有任何想法还是这是唯一的方法?顺便说一句,它不必使用:)。trans_rcvtrans_sendgoto

0 投票
7 回答
1839 浏览

java - 有没有去除无用 goto 的 Java 字节码优化器?

问题:我有一个方法可以编译成超过 8000 字节的 Java 字节码。HotSpot 有一个神奇的限制,使 JIT 不会为超过 8000 字节的方法启动。(是的,拥有一个巨大的方法是合理的。这是一个标记器循环。)该方法在一个库中,我不想要求该库的用户必须配置 HotSpot 才能停用魔法限制。

观察:反编译字节码表明 Eclipse Java 编译器生成了很多无意义的 goto。(javac 甚至更糟。)也就是说,有些 goto 只能通过跳转到达。显然,跳转到 goto 的跳转应该直接跳转到 goto 跳转的地方,并且 goto 应该被消除。

问题:是否有针对 Java 5 类文件的字节码优化器,它可以扁平化无意义的跳转链,然后删除不必要的 goto?

编辑:我的意思是这样的模式:

显然,第二个 goto 只能通过跳转到 8701 来达到,这也可能是直接跳转到 0。

在第二次调查中,这种可疑的模式更为常见:

显然,人们希望编译器将“不等于”比较反转为“相等”比较,跳转到 8704 并消除 goto。

0 投票
5 回答
1465 浏览

c - 使用 C switch 语句进行错误处理

考虑这个在实际工作之前检查错误的 C 构造:

你认为这是可读的吗?goto使用或堆叠的替代品if()会更好吗?

0 投票
6 回答
314 浏览

string - 我怎样才能在不损失速度或可读性的情况下重写它以删除 goto?

我写了这个。是的,我知道它是 VB6。是的,它是生产代码,而且,是的,我知道它使用 goto。我是一只懒惰、邪恶的野兽……

所以告诉我(和我们其他人)应该如何写

顺便说一句,它将一个字符串拆分为一个数组。字符串中的元素可以被引用。

0 投票
6 回答
6706 浏览

c++ - 使用 goto 是打破两个循环的合法方式吗?

我正在解决Project Euler的问题 9 。在我的解决方案中,我使用“goto”语句来打破两个 for 循环。问题如下:

毕达哥拉斯三元组是三个自然数 abc 的集合,其中,

a^2 + b^2 = c^2

例如,3^2 + 4^2 = 9 + 16 = 25 = 52。

恰好存在一个毕达哥拉斯三元组,其 a + b + c = 1000。求积 abc。

我的解决方案是在 C++ 中:

由于“goto”语句在 c++ 程序员中不是很流行,我想知道这是否可以被认为是“goto”的合理使用。或者,对于不需要“goto”的问题,是否有更好的解决方案。我的意思不是一个解决方案,它只是避免“goto”,而是以改进算法的方式避免“goto”。

0 投票
3 回答
364 浏览

delphi - 跳出块时是否有一种安全的方法来清理基于堆栈的代码?

我一直在研究PascalScript 脚本引擎的第 14 期,其中使用 Goto 命令跳出 Case 块会产生编译器错误,即使这是完全有效(如果丑陋)的 Object Pascal 代码。

结果编译器中的 ProcessCase 例程调用 HasInvalidJumps,它会扫描任何在 Case 块之外的 Goto,如果找到,则会给出编译器错误。如果我评论检查,它编译得很好,但最终在运行时崩溃。字节码的反汇编说明了原因。我已经用原始脚本代码对其进行了注释:

“转到 L1;” 103 处的语句跳过了 113 和 114 处的清理弹出,这使堆栈处于无效状态。

Delphi 对此没有任何问题,因为它不使用计算堆栈。然而,PascalScript 就没有那么幸运了。我需要一些方法来完成这项工作,因为这种模式在一些来自更简单系统的遗留脚本中非常常见,而我已经翻译成 PascalScript 并且需要能够支持的控制结构的方式很少。

任何人都知道如何修补 codegen 以便正确清理堆栈?

0 投票
13 回答
14474 浏览

c - while(1) .. break 而不是 goto

我在 C 程序中找到了以下代码:

这里while(1)用作“finally”的本地仿真。你也可以用gotos 来写:

我认为 goto 解决方案是一个常见的习惯用法。我在内核源代码中看到过多次出现这种习惯用法,并且在 Diomidis Spinellis 的“代码阅读”一书中也提到了它。

我的问题是:什么解决方案更好?使用该解决方案是否有任何具体原因while(1)

问题943826没有回答我的问题。

0 投票
4 回答
89678 浏览

matlab - MATLAB中的跳转命令

我正在使用 MATLAB 的 m 文件编辑器,我需要从一行跳到另一行。如果我需要从For...内部跳转end,我不能使用通常的“while”技术。
反正有没有从一条线跳到另一条线,就像goto在 C 中一样?

0 投票
8 回答
2185 浏览

c# - 为什么这个“最终”执行?

如果您运行下面的代码,它实际上会在每次调用 goto 之后执行 finally:

为什么?

0 投票
3 回答
1149 浏览

c# - C# 谜题:指向不可达标签的可达 goto

这是 Eric Lippert 在这篇文章中的评论:

既然你知道了答案,你就可以解决这个难题:给我写一个程序,其中有一个可到达的 goto,它指向一个不可到达的标签。– 埃里克·利珀特 7 月 17 日 7:17

我无法创建一个可以访问 goto 的代码,该代码指向一个无法访问的标签。这甚至可能吗?如果是,C# 代码会是什么样子?

注意:我们不要讨论“goto”有多糟糕等。这是一个理论练习。