是否有*任何*情况下“for _ in [1,2,3]”根本不会循环?

2023-12-08

我正在编写一些代码并犯了一个错误,该错误简化为:

func f() -> Int {
    for _ in [1,2,3] {
        return 1
    }
}

编译器向我显示一个错误,指出f缺少回报,这让我意识到我的错误。我忘记在周围放置一个 if 语句return!

但后来我意识到编译器实际上在撒谎!该函数将always返回一个值。或者会吗?有什么情况下for循环不会循环吗?

我问这个是因为其他同义反复结构编译得很好:

if 1 < 2 {
    return 1
}

while true {
    return 1
}

而且我也明白编译器无法评估every编译时表达式以查看它们是否是同义反复。我知道属性访问和方法调用通常不会在编译时进行评估,因此预计不会编译:

if "".isEmpty {
    return 1
}

但一般来说文字是可以的,对吧?毕竟,编译器必须评估文字[1,2,3]将其翻译为机器代码,表示“用 1, 2, 3 创建一个数组”。

那么为什么它不够聪明,无法弄清楚 for 循环呢? for 循环在某些罕见情况下会不会运行吗?


虽然对于人类来说,看到循环总是重复三次是微不足道的,因为列表文字是具有三个元素的常量,但对于语义分析级别的编译器来说,这是一个不平凡的事情。

在语义分析期间,编译器将评估“通用列表文字”([1,2,3]) 并确定它是类型的表达式Array<Int>。但是现在,当然,这是一个常量或该数组包含三个元素的信息丢失了。

语义分析通常使用程序员正在使用的相同(或非常相似)的类型系统来执行。由于与成本相比,将数组中的元素数量附加到类型(元素数量通常在编译时未知)几乎没有什么好处,因此通常不会这样做。另一方面,不断折叠(if 1 < 2 {)更容易实现并且更频繁地发生。

虽然在较低级别上,编译器可能会展开此循环并使用常量值,但这种情况发生得很晚 - 在 Swift 中,在生成 Swift 中间语言表示之后 - 并且可能仅在代码生成期间 - 在 SIL 被发送到 LLVM IR 之后当 LLVM 优化运行时。

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

是否有*任何*情况下“for _ in [1,2,3]”根本不会循环? 的相关文章

随机推荐

  • 如何在 ASP.NET 中从 JavaScript 触发按钮单击事件

    如何从 JavaScript 触发服务器端按钮单击事件 我尝试这样 document getElementById click 但没有用 我该怎么做 您可以将此行放在 JavaScript 函数中 doPostBack btnSubmit
  • DispatcherTimer - 如果上一个刻度仍在运行,则防止触发刻度事件

    在 Silverlight 应用程序中 我有一个代码块必须每 500 毫秒运行一次 我计划使用 DispatcherTimer 来实现此目的 请参阅下面的代码 DispatcherTimer dt new DispatcherTimer d
  • Visual Studio 更新是否会破坏 iText7?

    我在使用 iText7 7 1 6 和 Visual Studio 2019 时遇到问题 我的程序已经运行一年了 但刚刚将 Visual Studio 社区 从 16 6 1 更新到版本 16 6 2 我进行了重建 但没有更改任何内容 现在
  • Plupload HTML4 添加文件对话框在 IE 中未触发

    我正在使用 Plupload jQuery 版本 和 HTML4 for IE 由于某种原因 当我按下 添加文件 按钮时 它没有打开文件对话框 Plupload 容器被放置在一个对话框中 我调用 pluploadQueue 每次在我显示对话
  • 如何在 iOS 中计算 SHA-2(最好是 SHA 256 或 SHA 512)哈希值?

    安全服务 API 似乎不允许我直接计算哈希值 有很多公共领域和自由许可的版本可用 但如果可能的话 我宁愿使用系统库实现 数据可以通过 NSData 或普通指针访问 哈希的加密强度对我来说很重要 SHA 256 是可接受的最小哈希大小 这就是
  • 用于打印括号内整数的正则表达式

    第一次使用正则表达式 尽管 stackoverflow 中已经有很多例子 但无法让它工作 如何提取括号内字符串中的整数 Example dijdi d43 d5 55 43 32 dm dij 99 x 会回来 43 32 99 and 如
  • WPF:允许用户调整 RichTextBox 中图像的大小

    WPF 中的 RichTextBox 控件中是否有一种方法允许用户调整插入图像的大小 或者您是否必须为此设计自己的方法 我想要实现的目标如下所示 是写字板执行我想要的操作的屏幕截图 Notes 以纯文本形式读取 RTF 文件 我发现与图像大
  • Python:父子层次结构的组合

    对于子父关系表 csv 我尝试使用表中的所有数据收集可能的父子关系组合链 我正在尝试解决一个问题 如果存在多个子父级 参见第 3 行和第 4 行 则第二个子父级组合 第 4 行 不包含在迭代中 数据示例 孩子 父母 A B A C B D
  • 对 Android 库应用程序进行单元测试的最简单方法?

    抱歉 如果这是一个有点模糊的问题 但是我很难找到一个solid有关如何使用 Android 进行单元测试 隔离测试 的示例 这是我想要实现的目标的示例 Some class class Calculator public int Add i
  • 检测屏幕分辨率来加载替代 CSS 是个好主意吗?

    我与一位平面设计师合作 他一直希望制作大于我推荐的 960 像素的网站 我可以使用液体布局做一定量的工作 但我真的很喜欢能够加载不同的 CSS 以实现更大的分辨率 我用谷歌搜索并找到了下面的链接 但我担心我没有听到更多关于此的信息 这是一个
  • NSDate 一天的开始和一天的结束

    NSDate beginningOfDay NSDate date NSCalendar cal NSCalendar currentCalendar NSDateComponents components cal components N
  • 如何在android中使用Gson库解析json响应?

    我有 api 它的响应如下 0 serialize 1 login users token aaaaa message login successful 我如何使用 Gson 在 android 中解析它 创建一个 Json 的 pojo
  • 为什么 Tiles REGEXP 通配符定义会导致无尽的 jsp 包含错误

    我将tiles 2 2 2与Struts2 2 2 3一起使用 因为Struts2 Tiles插件相当旧 它的实现使用了许多Tiles已弃用的API 并且我想尝试REGEXP通配符 所以我在下面实现了我自己的监听器 我的TilesConta
  • 来自后台工作人员的文本框文本?

    我一直在试图弄清楚如何从后台工作人员中获取文本框的文本或其他属性 有人知道怎么做这个吗 我无法将其作为参数传递 因为它需要是实时的 谢谢您的帮助 我认为你只需要调用该属性 伪代码 private void bgw1 DoWork objec
  • 向订阅该主题的所有用户推送通知(使用 FCM Firebase 的登录用户除外)

    现在我有一个拥有一万多名成员的群组 并且我为一个群组创建了一个主题 通知主题 该群组中的所有用户都订阅了该主题 现在 在组内任何用户都可以添加图像 文件或视频等帖子 当用户添加帖子时 我需要向订阅该主题的所有用户发送通知 但除了一个之外 即
  • 如何检测 CMake 中的意外函数覆盖?

    我刚刚在我的 CMake 代码中发现了复制和粘贴错误 function name do something endfunction function name do something else endfunction 我已经多次复制 重命
  • SKLabelNode 将消失但仍然可点击

    我正在使用 SpriteKit 和 Swift 制作一个游戏 运行 Xcode 6 我有一个SKLabelNode 我们称之为myLabelNode对于这个例子 当我打电话时myLabelNode removeFromParent 它会像它
  • C# StreamReader 从标签输入文件?

    我一直在使用StreamReader inputFile代码来自ListBox它效果很好 但是 我想输入来自 txt文件到一个Label盒子代替 这可能吗 这是我尝试过的代码 它给了我一个错误描述 说明 Use of unassigned
  • 如何为 UIPageViewControllerDataSource 提供默认实现?

    我认为这个问题的答案通常会解决 Objective C 协议的问题 但这是我遇到的第一个问题 我希望在实施时使用这些方法UIPageViewControllerDataSourceWithConnections import UIKit p
  • 是否有*任何*情况下“for _ in [1,2,3]”根本不会循环?

    我正在编写一些代码并犯了一个错误 该错误简化为 func f gt Int for in 1 2 3 return 1 编译器向我显示一个错误 指出f缺少回报 这让我意识到我的错误 我忘记在周围放置一个 if 语句return 但后来我意识