是否有可能始终消除 goto?

2023-12-29

在做好一切的同时withgoto 很容易(由 f.ex. IL 证明),我想知道是否也可以消除all具有更高级别表达式和语句的 goto 语句 - 例如 - 使用 Java 支持的所有内容。

或者,如果您愿意:我正在寻找的是始终有效的“重写规则”,无论 goto 的创建方式如何。

它主要是作为一个理论问题,纯粹是出于兴趣;不作为好的/坏的做法。

我想到的明显的解决方案是使用这样的东西:

while (true)
{
    switch (state) {
       case [label]: // here's where all your goto's will be
          state = [label];
          continue;
       default:
          // here's the rest of the program.
    }
}

虽然这可能会起作用并且确实适合我的“正式”问题,但我一点也不喜欢我的解决方案。其一,它非常丑陋;其二,它基本上将 goto 封装到一个 switch 中,其功能与 goto 的功能完全相同。

那么,有没有更好的解决方案呢?


Update 1

由于很多人似乎认为这个问题“太宽泛”,所以我将详细说明一下......我提到 Java 的原因是因为 Java 没有“goto”语句。作为我的爱好项目之一,我试图将 C# 代码转换为 Java,事实证明这是相当具有挑战性的(部分原因是 Java 中的这一限制)。

这让我思考。如果你有f.ex。开放寻址中“remove”方法的实现(参见:http://en.wikipedia.org/wiki/Open_addressing http://en.wikipedia.org/wiki/Open_addressing- 注意1),在特殊情况下使用“goto”非常方便,尽管在这种特殊情况下您可以通过引入“state”变量来重写它。请注意,这只是一个示例,我已经实现了用于延续的代码生成器,当您尝试反编译它们时,它会生成大量的 goto。

我也不确定在这件事上重写是否总是会消除“goto”语句,以及是否在每种情况下都允许它。虽然我并不是在寻找正式的“证据”,但一些证明在这件事上可以消除的证据就很好了。

因此,关于“广度”,我向所有认为“答案太多”或“重写 goto 的方法太多”的人提出挑战,请提供算法或重写一般情况的方法,因为我找到的唯一答案到目前为止是我发布的。


这篇 1994 年的论文:提出了一种消除 C 程序中所有 goto 语句的算法。该方法适用于用 C# 编写的任何程序或使用 if/switch/loop/break/continue 等常见结构的任何语言(AFAIK,但我不明白为什么它不会)。

它从两个最简单的转换开始:

  • Case 1

    Stuff1();
    if (cond) goto Label;
    Stuff2();
    
    Label:
    Stuff3();
    

    becomes:

    Stuff1();
    if (!cond)
    {
      Stuff2();
    }
    Stuff3();
    
  • Case 2

    Stuff1();
    Label:
    Stuff2();
    Stuff3();
    if (cond) goto Label;
    

    becomes:

    Stuff1();
    do
    {
      Stuff2();
      Stuff3();
    } while (cond);
    

并在此基础上检查每个复杂的案例并应用导致这些简单案例的迭代转换。然后以最终的 goto/标签消除算法结束。

这是一本非常有趣的读物。

UPDATE:关于该主题的其他一些有趣的论文(不容易掌握,所以我在这里复制直接链接以供参考):

删除 Goto 语句的正式基础 http://csep.hpcc.nectec.or.th/Journals/oup/smj/journals/ed/titles/computer_journal/Volume_39/Issue_03/39.3.pdf/3933.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有可能始终消除 goto? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 如何自定义 JQPlot 周围的黑色边框

    如何在 JQPlot 中自定义图表周围的黑色边框 我广泛搜索了 CSS 文件 但没有找到任何内容 UPDATE 如果您不明白我的意思 请看这张图片 http img339 imageshack us img339 5796 jqplot p
  • 支持多种TLS协议的HttpClient

    我们正在编写一个必须使用 HTTPS 与一些服务器通信的应用程序 它需要与 AWS 使用 AWS 库 以及我们使用 TLS 1 2 的一些内部服务进行通信 我首先将 HttpClient 更改为使用 TLS 1 2 SSLContext p
  • 我对 PHP 会话的理解是否正确?

    我一直对会话内部如何工作很感兴趣 但我对 C 知之甚少 并且不确定在 PHP 源代码中哪里可以找到这一点 这是我目前对会话的理解 当您启动会话时 用户会被分配一个存储在 cookie 中的会话 ID 保存会话数据时 通过 SESSION 它
  • PHP 文件上传类型检查

    好的 这是我上传文件的代码 ext whitelist array pdf doc doc mkv mp4 mpg mpeg avi flv wma ogg if in array ext ext whitelist uniqid file
  • Firebase 托管应用引擎 URL 的 Access-Control-Allow-Origin

    我在 Firebase 托管上托管一个单页应用程序 我需要允许对应用程序引擎的跨域请求 应用程序托管在project id firebaseapp com 上 应用程序引擎服务托管在project id appspot com 上 我把部署
  • 如何用RadWindow替换警报消息框

    My Code
  • 在 Obj-C 中获取 AppleScript 返回值

    我在 Obj C cocoa 项目中使用一些 AppleScript 来控制 QuickTime 播放器 播放 暂停 停止 快进和快退等 取得了巨大成功 尽管我对 AppleScript 的了解非常有限 然而 我最想要的是电影的 当前时间
  • R:在循环内定义函数

    在循环中定义多个函数 par lt 1 2 parameters for functions qF lt list list I will write the functions into for i in 1 2 qF i lt func
  • 使用 CSS 将顶部和底部边框添加到一组选定元素

    所以我有一个搜索结果网格 这些结果是可选择的 当它们被选择时 我添加class selected 给他们 可以有多组结果 通过命令 按住 Ctrl 键单击行来完成 我所说的结果组是指选择的连续元素 我想要做的是 仅向任何给定的选定结果组的第
  • 获取所有登录用户

    我想有自己的聊天 我无法使用聊天模块 因为我必须对其进行个性化 我必须检索所有在线用户 但我看不到任何变量 我只能获取当前登录用户的名称 而无法获取其余登录用户的名称 您可以通过查询会话表来获取所有登录用户的列表 我假设您使用的是 Drup
  • 在 ASP.net Core Web Api 中动态选择身份验证方案

    我正在将使用 OWIN 和 NET Framework 构建的自托管 Web API 移植到 ASP NET Core Web API 使用 NET 6 0 在原始 API 中 我有一个自定义身份验证机制 可以根据请求中的标头动态为每个调用
  • MailChimp API 成员信息问题

    我需要通过 api 检索所有用户信息 在我发现的文档中查找它 http apidocs mailchimp com api 2 0 lists member info php http apidocs mailchimp com api 2
  • 无法安装包车

    我在 Linux mint 17 3 64 位中使用 R 版本 3 2 3 我试图安装包 car dependencies TRUE 但安装失败并出现以下错误消息 gt warnings Warning messages 1 In inst
  • 通过 VBA 使用 SFTP 下载文件

    我的目标是从 SFTP 服务器下载文件 而不是上传文件 并且我正在尝试调整本网站上另一个问题的代码来执行此操作 为了方便起见 我粘贴了下面的代码 我从 Putty 下载了 PSFTP 当我尝试使用以下命令行进行连接时 PSFTP 关闭 op
  • PHP 比较和更改多维数组中的某些元素

    简而言之 我有两个简单的数组 我想验证第二个数组中的某些键是否具有空值 并将它们替换为第一个数组中的对应值 Example a1 1 gt one 2 gt two 3 gt three 5 gt cinco 6 gt six a2 2 g
  • 数据绑定如何工作?

    我现在正在尝试将数据添加到列表框中 如果您查看我的 XAML 这是我构建的列表框
  • 无法访问 Chrome 中另一个框架的内容

    我有两个框架 两个框架中的页面都来自同一域 本地主机或活动域 都使用相同的协议 当第二个框架 xsample 完全加载并且任何 onload JS 函数完成时 第一个框架需要访问第二个框架 xsample 的元素 但第二帧需要一段时间才能加
  • 在 codeigniter 中创建父树及其子树

    我正在 codeigniter 中工作 我想在父代理下显示父代理及其子代理 我的父代理数据显示如下 Array 0 gt stdClass Object id gt 1 Introducer code gt 0 Designation gt
  • PHP 速记加法运算符 - 未定义的偏移量

    我使用 PHP 速记加法运算符来统计多维数组中特定 id 出现的次数 source tally array foreach items as item source tally item gt getId 1 第一次遇到新 id 时 它将其
  • 是否有可能始终消除 goto?

    在做好一切的同时withgoto 很容易 由 f ex IL 证明 我想知道是否也可以消除all具有更高级别表达式和语句的 goto 语句 例如 使用 Java 支持的所有内容 或者 如果您愿意 我正在寻找的是始终有效的 重写规则 无论 g