在大多数C衍生语言(C,Java,Javascript等)中,for
循环具有相同的基本语法
for (int i = 0; i < 100; i++) {
// code here
}
为什么通常在行尾保留分号,为什么此语法包含分号?另外,为什么i++
之后没有分号?
此伪代码:
for (A; B; C) {
D;
}
可以在内部转换为
{ // scope bracket
A;
while (B) {
D;
C;
}
}
分号不用于结尾行。用于结束指令。在大多数这些语言中,您可以执行以下操作:
int i;i = 0;
这是合法的。寻找任何缩小的Javascript代码。您将看到每行数千个分号。
按照相同的原理,for块需要三个指令。它们之间用分号分隔,以便编译器或解释器知道每个命令的开始和结束位置。
这是完全合法的(尽管它会导致无限循环):
for (;;) {}
我认为可以通过检查语言解析器如何解析语法来充分回答这一问题。例如,一个for循环的常见描述是:
for (initialization; condition; increment-decrement) {
/** statements **/
}
您可以将其概括为:
for (expression; expression; expression) {
/** statements **/
}
注意,泛化并不完全准确,因为中间表达式通常仅保留给关系表达式,而另外两个是语句或语句列表。例如,在C和C ++中,您可以使用逗号(,)运算符在初始化程序或递增或递减区域中包含多个语句。
它可能有助于注意,语句通常是零个或多个表达式的集合,通常由运算符分隔。
在许多语言中,分号不会出现在代码行的末尾,它通常会出现在语句的末尾。语句通常被定义为一段代码中最小的独立可执行元素代码。语句的一种常见类型是表达式语句,它是仅由一个表达式组成的语句。这有助于解释为什么在for循环结构中每个表达式的末尾都有分号,因为它与语言解析器解释语句的方式一致。
末尾没有分号,仅仅是因为这就是语言语法的定义方式。如上所述,其他组件可能是为了保持一致性。
这很难回答,但是我认为一个可能的原因是它与过去的做法是一致的。 C是一种非常流行的语言,许多语言的语法都基于C的某种变体,包括C ++,C#,Objective-C,Java,Python,Perl和JavaScript。
[对于这种特殊的for(;;){}
语法为何诞生,可能没有合理的解释。您应该向Kernighan或Ritchie询问。
[追溯到60年代的编程语言历史,花括号可能已经出现在BCPL编程语言中,而用括号包围的条件用B修饰(B仅带有while
语句,没有for
)。 C是在B上建模的。
[自1972年以来,C已渗透到计算机工程和后续语言的所有领域,这些领域通常以C语法为模型(C ++,Java,Javascript,C#,Scala,仅举几例),以不破坏已建立程序员的习惯。这包括for(;;)
循环语法和花括号。
[作为旁注,有许多不使用C样式语法的广泛语言,例如Python,其for
循环可能会发现更多的逻辑(很明显,这是个人选择)或Ruby。
一般形式是:
for ( expression; expression; expression ) { ... }
解析器可以轻松识别这些表达式,因为它们的语法与“正常”表达式的正弦相同:
{
expression;
expression;
...
}
最后一个表达式很容易识别,因为它以')'结尾。此外,不能使用逗号,因为它们可以放在单个表达式中:
for ( i=1,j=10; i<10,j>0; i++,j--) { ... }
扩展@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 ++中使用,其他语言也随之使用。