在大多数C派生语言(C,Java,Javascript等)中,for
循环具有相同的基本语法
for (int i = 0; i < 100; i++) {
// code here
}
为什么这种语法包含分号,当分号通常保留在行尾时?另外,为什么i++
之后没有分号?
答案 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循环结构中每个表达式的末尾都有一个分号,因为它与语言分析器如何解释语句一致。
最后没有分号,因为这就是语法语法的定义方式。如上所述,其他组件可能是为了保持一致。
这很难回答,但我认为可能的原因是它与过去的做法一致。 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