Swift 为什么变量赋值之外的数字要编译?

Swift 为什么变量赋值之外的数字要编译?,swift,Swift,为什么我可以在Swift中键入数字而不将它们分配给var或let,这样代码就可以很好地编译?这有什么用 import Foundation 55 25 23+8 print("Hello, World!") 4 11 -45 这有什么用 import Foundation 55 25 23+8 print("Hello, World!") 4 11 -45 它对任何事情都没有好处,因为它不会导致程序流发生任何事情。如果你明白我的意思的话,那只是为了好玩。数值不会被

为什么我可以在Swift中键入数字而不将它们分配给var或let,这样代码就可以很好地编译?这有什么用

import Foundation

55

25

23+8

print("Hello, World!")

4

11

-45
这有什么用

import Foundation

55

25

23+8

print("Hello, World!")

4

11

-45
它对任何事情都没有好处,因为它不会导致程序流发生任何事情。如果你明白我的意思的话,那只是为了好玩。数值不会被捕获,因此实际上它会立即被丢弃,就像一个虚拟粒子,瞬间闪现,下一瞬间又消失

它合法的原因是Swift语句是一个可计算的表达式。数值文本是一个可计算的表达式,因此它作为一个独立的语句是合法的,尽管它没有用处

你可以在很多其他方面看到同样的事情。这是合法的:

let n = 23
n
n
是一个可计算的表达式,因此作为单独的语句是合法的。但它是无用的


编辑回答下面的评论:我看不出一条无用的语句有什么理由阻止程序编译。但在这样的情况下,我同意如果编译器警告您正在做一些无用的事情可能会有所帮助,事实上,至少有一种情况是这样的,我已经提交了一份错误报告要求这样做。

这与数字或表达式是有效语句这一事实有关。所以它可以独立存在。其他一些语言具有相同或相似的特性

Swift是一种有副作用的语言,这意味着某些操作可能导致程序的全局状态发生变化。这意味着编译器不能简单地消除独立语句,而不额外确保它可以在不影响程序执行的情况下这样做。由于程序中状态的复杂性,这通常不是一个小问题,因此为了不惩罚希望调用具有副作用的函数的用户,必须画一条线;斯威夫特选择让用户发表任何类型的独立声明,即使是明显没有副作用(常量或常量表达式)的声明,而不是花费大量精力试图区分各种可能性


可能会有一个编译时警告,显示没有效果的代码行。我对斯威夫特了解不多,所以我不能告诉你,但如果有,你应该可以在文档中找到它。

就像在任何语言中,你都可以念出不感兴趣的句子。。。55是一个如此迅速的判决。您可能认为消除无用的句子可能很容易,但这是不可能的,所以为什么不(在编译时)消除明显的句子呢?因为,一般来说,人们不会尝试使用它们或只是为了锻炼,这不值得付出努力。禁止55是很容易的,但是
n=n
呢?容易的?或者
n=2*n-n
(这要复杂得多,因为您需要在编译器内部实现表达式的数学属性,并为它们提供优化技巧)。

有功能有什么错?现在没有人会高兴。我看不出这个功能的逻辑,因为我不能用这种方式访问数字。记住Swift有一个立即模式,显示每个语句的结果,通常称为。这是一个例子。这使斯威夫特成为一个非常方便的计算器。我一直使用Ruby的
irb
进行快速计算。是的,但是因为它没有用处,我希望编译器会给出错误,但是编译器认为它是可以的。你注意到事情并不总是像你期望的那样吗?我的意思是,我同意如果编译器发出警告会很好,但事实并非如此。一个特别好的例子是:
var n=23;n==24
这实际上是真实代码的简化版本。第二行是错误的;我的意思是说
n=24
。我所说的没有用。在我看来,编译器应该发出警告,事实上,我已经提交了一份bug报告。如果你同意,也要提交一份bug报告!