问题标签 [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 投票
3 回答
221 浏览

goto - 如何避免将 goto 用于一系列提示?

我正在编写一个基于控制台的应用程序,它会提示用户提出一系列问题。例如:

“输入要打开的记录:”

“你想做X吗?”

“你想做Y吗?”

“你确定你要继续吗?”

如果用户在任何提示下都没有输入任何内容,我想上一层。这很容易使用 goto。我能想到的唯一另一种方法是嵌套 for 循环,它看起来丑陋,并且对于多个提示变得非常笨拙。必须有一个简单的方法来做到这一点,但我只是想不出。

0 投票
9 回答
2662 浏览

c# - 在 C# 中处理“循环初始化”的其他方法

首先,我同意 goto 语句在很大程度上与现代编程语言中的高级构造无关,并且在有合适的替代品可用时不应使用。

我最近在重读 Steve McConnell 的 Code Complete 的原始版本,忘记了他对常见编码问题的建议。几年前我刚开始的时候就读过它,但我认为我没有意识到这个食谱有多么有用。编码问题如下:在执行循环时,您经常需要执行循环的一部分来初始化状态,然后用其他一些逻辑执行循环,并用相同的初始化逻辑结束每个循环。一个具体的例子是实现 String.Join(delimiter, array) 方法。

我想每个人对这个问题的第一反应就是这个。假设 append 方法被定义为将参数添加到您的返回值。

注意:对此的轻微优化是删除 else 并将其放在循环的末尾。赋值通常是单条指令,等效于 else,将基本块的数量减少 1,并增加主要部分的基本块大小。结果是在每个循环中执行一个条件来确定是否应该添加分隔符。

我还看到并使用了其他方法来处理这个常见的循环问题。您可以先在循环外执行初始元素代码,然后从第二个元素执行循环到结束。您还可以更改逻辑以始终附加元素,然后附加分隔符,一旦循环完成,您可以简单地删除您添加的最后一个分隔符。

后一种解决方案往往是我更喜欢的解决方案,只是因为它不会复制任何代码。如果初始化序列的逻辑发生变化,您不必记住在两个地方修复它。然而,它确实需要额外的“工作”来做某事然后撤消它,这至少会导致额外的 cpu 周期,并且在许多情况下,例如我们的 String.Join 示例也需要额外的内存。

当时我很兴奋读到这个结构

这样做的好处是您不会得到重复的代码,也不会得到额外的工作。您开始循环到执行第一个循环的一半,这就是您的初始化。您仅限于使用 do while 构造来模拟其他循环,但翻译很容易,阅读起来并不困难。

所以,现在的问题。我很高兴地尝试将它添加到我正在处理的一些代码中,但发现它不起作用。在 C、C++、Basic 中效果很好,但在 C# 中,您不能跳转到不是父作用域的不同词法作用域内的标签。我非常失望。所以我想知道,在 C# 中处理这个非常常见的编码问题(我主要在字符串生成中看到它)的最佳方法是什么?

也许更具体的要求:

  • 不要重复代码
  • 不要做不必要的工作
  • 不要比其他代码慢 2 到 3 倍
  • 可读

我认为可读性是我所说的食谱唯一可能会受到影响的事情。但是它在 C# 中不起作用,那么下一个最好的事情是什么?

* 编辑 * 因为一些讨论,我改变了我的表现标准。性能通常不是这里的限制因素,所以更正确的目标应该是不要不合理,不要成为有史以来最快的。

我不喜欢我建议的替代实现的原因是因为它们要么重复代码,这为更改一个部分而不是另一部分留出了空间,或者对于我通常选择的那个,它需要“撤消”操作,这需要额外的思考和时间来撤消事情你刚刚做的。特别是对于字符串操作,这通常会使您因一个错误或未能考虑空数组并试图撤消未发生的事情而打开关闭状态。

0 投票
6 回答
39815 浏览

c# - goto 语句在这个例子中是如何工作的?

我正在研究这个代码示例:

我不明白为什么“未找到”语句被调用,并且如果我输入像 10 这样的搜索编号,则在控制台上打印相应的消息,在这种情况下 goto: Found 语句正在执行,所以 goto: NotFound 语句将永远不会被调用,但是它的相应消息仍然打印在控制台上,我不明白为什么在这种情况下程序永远不会跳转到这个“NotFound”标签。

如果你现在帮我解决这个问题,请...

谢谢

0 投票
11 回答
4674 浏览

c# - C# goto use - 这里还有什么要使用的?

我知道使用 goto 是大多数人说要避免的事情,但是我在很多地方读到过,如果你需要简单的代码,有时它很有用。目前,如果用户选择,我有一个非常简单的程序需要重复:

在这里使用 goto 真的很糟糕吗?我只是看不到任何其他方式如何在不执行循环等的情况下重复代码。这似乎是一种非常简单明了的方式。还是我错过了什么?

0 投票
1 回答
5588 浏览

tsql - 具有多个 GO 的脚本中的 SQL GOTO 语句

如果某个条件成立,我需要在没有错误的情况下退出 SQL 脚本。我读过 1 解决方案是raiseerror使用错误代码 20+ 和with log参数。但这样做的限制是我只能以管理员身份执行该操作,并且与数据库的连接将被中止。

另外,我尝试使用 GOTO 并跳转到脚本的末尾,但它不起作用,因为我在脚本中间有多个 GO。还有其他解决方案吗?

IF <some condition> BEGIN
GOTO Finished;
END
GO

Finished:
SELECT 'Done'

谢谢!

0 投票
3 回答
679 浏览

delphi - Delphi:Goto 在这种情况下不被认为是有害的吗?

好的,所以你有一个 TObjectList 实例。您想遍历其中的项目并从列表中删除一些对象。你不能这样做:

...因为一旦你删除了第一个对象,索引计数器我就会错了,循环将不再起作用。

所以这是我的解决方案:

这是迄今为止我找到的最好的解决方案。如果有人有更整洁的解决方案,我很乐意看到它。

0 投票
6 回答
456 浏览

c# - 在这种情况下使用“goto”可以接受吗?

以下是伪代码:

我在一个方法中有几个 try-catch 块,我不想从一开始就为每个抛出的异常重新调用我的方法。goto在这种情况下使用可以接受吗?

0 投票
2 回答
9838 浏览

windows - 带有goto命令的Windows批处理文件不起作用

我对 GOTO 命令和附属标签有疑问。

事实:给定文件夹中的一堆文件(它们是日志错误),我需要打开它们并检查它们是否包含特定的字符串。如果是,则从文件名中删除一些字符(“_”最后一次出现之后的所有字符,包括它自己)并执行其他操作。

为了切断字符,我以循环方式使用 GOTO 命令,因为我发现它在这里描述:http ://www.robvanderwoude.com/battech_while_loops.php

脚本是:

脚本没有运行,因为标签 loopEnd 后面有一个空行?!如果我在该标签之后编写任何指令,它们将被执行,但不会执行第一个 for 语句的其余迭代(日志错误文件夹包含多个文件)

有人可以提供帮助吗?

0 投票
3 回答
678 浏览

c++ - goto 代码行无法执行

我一直被教导在编程中几乎从不使用 goto 语句。但是,作为我最近的编程项目的一部分,我们必须这样做。我有一个带有各种 goto 语句的 if/else 语句,而 goto 语句无法执行。我不知道为什么。任何帮助,将不胜感激。

移位等的简要说明:我们正在实现一个计算机处理器,需要查看 25 位操作码的前 3 位。所以 (myInt >> 22) & 7 隔离了操作码中的 3 位。

关于这里发生了什么的任何想法?

0 投票
13 回答
3694 浏览

c# - 可以替代链式开关/转到的设计模式?

我有一个用于将我的应用程序资源更新到当前应用程序版本的代码。此代码在应用程序更新后调用。

这里我们有一个级联方法通过跳转到指定的案例块来调用。我想知道 - 在这种情况下使用 go to 是一种好的做法(通常被认为是这样的坏做法!)?我不想一个接一个地调用方法——像这样:

是否有任何设计模式描述了这样的问题?