为什么for循环使用分号?

时间:2013-05-06 21:24:34

标签: language-agnostic

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

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

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

6 个答案:

答案 0 :(得分:10)

这个伪代码:

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

可以在内部转换为

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

答案 1 :(得分:2)

分号不用于结尾。这是结束指示。在大多数这些语言中,您可以这样做:

int i;i = 0;

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

根据相同的原理,for block需要三条指令。它们以分号分隔,以便编译器或解释器知道每个命令的开始和结束位置。

这是完全合法的(虽然它导致无限循环):

for (;;) {}

答案 2 :(得分: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。

答案 3 :(得分:1)

对于为什么这种特定的for(;;){}语法诞生,可能没有合理的解释。你应该问Kernighan或Ritchie。

回到编程语言的历史到60年代初期,花括号可能出现在BCPL编程语言中,而parantheses包含了被B赞美的条件(只有while语句,没有for)。 C模仿B。

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

作为旁注,有许多普遍的语言不采用C风格的语法,例如Python,其for循环可能会发现更多逻辑(显然,这是个人的opionion)或Ruby。

答案 4 :(得分:0)

一般形式是:

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

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

{
    expression;
    expression;
    ...
}

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

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

答案 5 :(得分:0)

for是一种语言关键字/说明-不要与对库函数的调用相混淆。

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

发件人:

for( start-condition ; end-condition ; step-control )

类似这样:

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

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

在c中,分号是行/命令终止符。换句话说,它是一个行分隔符。在for循环中,它是术语的分隔符。

在c中,并非所有术语都是必需的:

for(;;)

是有效的代码。等效于while(1)(伪:while(true))

在Pascal / modular2中,结构不同

for i:= start_value to end_value do