首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么有些语言需要分号?

问为什么有些语言需要分号?
EN

Stack Overflow用户
提问于 2011-01-16 01:48:33
回答 7查看 14.1K关注 0票数 21

我知道在像Java这样的语言中,分号表示一行的结束,但是为什么呢?

很多人问我这个问题,我真的想不出一个好的方法来解释它是如何比仅仅使用换行或空白更好地工作的。

EN

回答 7

Stack Overflow用户

发布于 2011-01-16 01:53:50

它们不表示行的结束,它们表示语句的结束。

有一些语言并不需要它们,但这些语言不允许在一行中使用多个语句,也不允许单个语句跨越多个行(没有像VB的_ signal这样的其他信号)。

为什么有些语言允许在一行上有多个语句?原理是空白是无关紧要的(行尾字符就是空白)。这允许灵活地格式化代码,因为格式化不是语义含义的一部分。

票数 19
EN

Stack Overflow用户

发布于 2016-03-13 07:40:40

首先,分号是语句分隔符,而不是行分隔符。一些语言使用换行符作为语句分隔符,但是忽略所有空格的语言倾向于使用分号。

为什么语言会忽略空格?

一种语言会忽略空格,以允许程序员按照自己的喜好格式化源代码。例如,在Java中,

代码语言:javascript
复制
if (welcome)
    System.out.println("hello world");

和

代码语言:javascript
复制
if (welcome) System.out.println("hello world");

这不是因为在语言的语法中每种情况都有一个单独的大小写,而是因为空白被简单地忽略了。

为什么编程语言需要语句分隔符?

这是问题的核心。为了理解它,让我们考虑一种没有任何语句分隔符的小型语言。它包含以下语句类型:

代码语言:javascript
复制
var x = foo()
y[0, 1] = x
bar()

这里,y是一个二维数组,x被写入到y的一个条目中。

现在,让我们看看这些语句,就像编译器会看到它们一样:

代码语言:javascript
复制
var x = foo() y[0, 1] = x bar()

因为没有语句分隔符,所以编译器必须自己识别每个语句的结尾,才能理解输入。编译器能做到这一点吗?我猜在上面的例子中,编译器可以做到这一点。

现在,让我们向out language添加另一种类型的语句:

代码语言:javascript
复制
[x, y] = ["hello", "world"]

多重赋值允许程序员一次赋值多个。在该行之后,变量x将包含值"hello",而变量y包含"world"。这对于允许一个函数有多个返回值可能非常方便。现在,它如何与其余的语句类型一起工作呢?

考虑以下语句序列:

代码语言:javascript
复制
foo()
[x, y] = [1, 2]

首先,我们将该方法称为foo。然后,我们将1赋值给x,将2赋值给y。至少这是我们想要做的。以下是编译器看到的内容:

代码语言:javascript
复制
foo() [x, y] = [1, 2]

编译器能够识别每条语句吗?不是的。至少有两种可能的解释。第一个是我们想要的。下面是第二个:

代码语言:javascript
复制
foo()[x, y] = [1, 2]

这是什么意思?首先,我们将该方法称为foo。这个方法应该返回一个二维数组。现在,我们在返回的数组中的位置[x, y]处写入数组[1, 2]。

编译器无法识别语句,因为给定输入至少有两种有效解释。当然,这永远不应该发生在真正的编程语言中。在给定的示例中,这可能很容易解决,但重点是很难在没有语句分隔符的情况下设计一种编程语言来避免歧义。这很难,因为语言设计者必须考虑语句类型的所有可能的排列,以确保语言不会有歧义。

因此,语句分隔符帮助语言设计者最初设计语言,但更重要的是,它允许语言设计者在将来容易地扩展语言,例如通过添加新的语句类型。这是一件很重要的事情,因为一旦代码用您的语言编写,您就不能简单地更改现有语句类型的语法,因为这将导致所有现有代码不再编译。

TL;DR

总而言之,分号是在空白忽略语言中作为语句分隔符引入的,因为有语句分隔符的语言更容易设计和扩展。

票数 17
EN

Stack Overflow用户

发布于 2011-01-16 01:54:46

许多语言都允许您随意放置空格。这让你可以控制代码的外观。

考虑一下:

代码语言:javascript
复制
 String result = "asdfsasdfs"
               + "asdfs"
               + "asdfsdf";

因为允许插入额外的换行符,所以可以将该行拆分成几行,这是没有问题的。语言仍然需要知道行已经结束,这就是为什么你需要一个分号。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4701137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档