为什么for循环使用分号?

问题描述 投票:3回答:6

在大多数C衍生语言(C,Java,Javascript等)中,for循环具有相同的基本语法

for (int i = 0; i < 100; i++) {
    // code here
}

为什么通常在行尾保留分号,为什么此语法包含分号?另外,为什么i++之后没有分号?

language-agnostic
6个回答
11
投票

此伪代码:

for (A; B; C) {
    D;
}

可以在内部转换为

{ // scope bracket
    A;
    while (B) {
        D;
        C;
    }
}

2
投票

分号不用于结尾行。用于结束指令。在大多数这些语言中,您可以执行以下操作:

int i;i = 0;

这是合法的。寻找任何缩小的Javascript代码。您将看到每行数千个分号。

按照相同的原理,for块需要三个指令。它们之间用分号分隔,以便编译器或解释器知道每个命令的开始和结束位置。

这是完全合法的(尽管它会导致无限循环):

for (;;) {}

1
投票

我认为可以通过检查语言解析器如何解析语法来充分回答这一问题。例如,一个for循环的常见描述是:

for (initialization; condition; increment-decrement) {
    /** statements **/
}

您可以将其概括为:

for (expression; expression; expression) {
    /** statements **/
}

注意,泛化并不完全准确,因为中间表达式通常仅保留给关系表达式,而另外两个是语句或语句列表。例如,在C和C ++中,您可以使用逗号(,)运算符在初始化程序或递增或递减区域中包含多个语句。

它可能有助于注意,语句通常是零个或多个表达式的集合,通常由运算符分隔。

为什么for循环语法使用分号?

在许多语言中,分号不会出现在代码行的末尾,它通常会出现在语句的末尾。语句通常被定义为一段代码中最小的独立可执行元素代码。语句的一种常见类型是表达式语句,它是仅由一个表达式组成的语句。这有助于解释为什么在for循环结构中每个表达式的末尾都有分号,因为它与语言解析器解释语句的方式一致。

为什么末尾没有分号?

末尾没有分号,仅仅是因为这就是语言语法的定义方式。如上所述,其他组件可能是为了保持一致性。

关于不使用提到的分号的语言呢?

这很难回答,但是我认为一个可能的原因是它与过去的做法是一致的。 C是一种非常流行的语言,许多语言的语法都基于C的某种变体,包括C ++,C#,Objective-C,Java,Python,Perl和JavaScript。


1
投票

[对于这种特殊的for(;;){}语法为何诞生,可能没有合理的解释。您应该向Kernighan或Ritchie询问。

[追溯到60年代的编程语言历史,花括号可能已经出现在BCPL编程语言中,而用括号包围的条件用B修饰(B仅带有while语句,没有for )。 C是在B上建模的。

[自1972年以来,C已渗透到计算机工程和后续语言的所有领域,这些领域通常以C语法为模型(C ++,Java,Javascript,C#,Scala,仅举几例),以不破坏已建立程序员的习惯。这包括for(;;)循环语法和花括号。

[作为旁注,有许多不使用C样式语法的广泛语言,例如Python,其for循环可能会发现更多的逻辑(很明显,这是个人选择)或Ruby。


0
投票

一般形式是:

for ( expression; expression; expression ) { ... }

解析器可以轻松识别这些表达式,因为它们的语法与“正常”表达式的正弦相同:

{
    expression;
    expression;
    ...
}

最后一个表达式很容易识别,因为它以')'结尾。此外,不能使用逗号,因为它们可以放在单个表达式中:

for ( i=1,j=10; i<10,j>0; i++,j--) { ... }

0
投票

扩展@wchargin的内容

for是语言关键字/说明

关键字/说明是语言的一部分;因此,编译器将需要在编译,解释期间生成汇编代码(或某种类型的指令代码)。当用C语言(由Brian Kernighan和Dennis Ritchie开发)for指令时,他们将不得不选择for操作的语法,以及该操作将如何分解为汇编程序]

例如

mov eax, $x
beginning:
cmp eax, 0x0A
jg end
inc eax
jmp beginning
end:
mov $x, eax

此语法随后在C ++中使用,其他语言也随之使用。

© www.soinside.com 2019 - 2024. All rights reserved.