for和while循环中没有循环条件

while(cond) // fine for(;cond;) //fine 

但当我删除条件部分

 while() //syntax compilation error for(;;) //Infinite loop 

这些循环如何在内部实现? 或者,编译器(解析器)如何知道while中的空状态是错误而且是无限的?

我没有发现任何关于这一点的事情,我认为在C中像我这样的人(初学者)可能会有同样的困惑

该标准要求for循环的省略条件由非零常量替换:

C11 6.8.5.3 :(强调我的)

6.8.5.3 for语句

1(clause-1; expression-2; expression-3)语句的语句行为如下:表达式expression-2是在每次执行循环体之前计算的控制表达式。 在每次执行循环体之后,表达式-3被评估为void表达式。 如果子句1是一个声明,它声明的任何变量的范围是声明的剩余部分和整个循环,包括其他两个表达式; 它是在控制表达式的第一次评估之前按执行顺序到达的。 如果子句-1是一个表达式,则在第一次评估控制表达式之前将其计算为void表达式。

2可以省略clause-1和expression-3。 省略的表达式-2由非零常量替换。

由于没有对while循环的这种要求(如果条件被省略),我相信,它留给了编译器的实现。

没有技术原因可以解释为什么一个有效,另一个没有。 这是语言设计者的人为因素考虑因素。 他们觉得使用for (;;)的无限循环比while ()更有意义。 他们可能受到了穴居人使用的语言ALGOL的影响。

确定程序的语法和语义正确性的条件被编码为语言语法。 语言语法是由语言创造者创造的,它们决定语言的外观,就像C一样。我认为for(;;)while(1)背后的基本直觉是for(;;)任何部分。可以省略,虽然while(1)完全足以创建无限循环,而while()只是一个狭窄的情况下的hacky角落情况。

它是C语法的一部分。 每种编程语言都有其正式的语法规范(这里是BNF中的Cforms语法 – 即什么是语法正确,什么不是。在Cforms语法中你可以看到, 虽然必须看起来像:

‘while”(’exp’)’stat

单引号(终端符号)中的单词/符号是强制性的:’while’,’(’和’)’。 非引用词(非终端符号)也是在forms语法中指定的。 如果你分析了Cforms语法,你会发现exp 不可能什么 。 另一方面,如果你看了,你会发现它看起来像:

‘for”(’exp’;’exp’;’exp’)’stat

| ‘for”(’exp’;’exp’;”)’stat

| ‘for”(’exp’;”;’exp’)’stat

| ‘for”(’exp’;”;”)’stat

| ‘for”(”;’exp’;’exp’)’stat

| ‘for”(”;’exp’;”)’stat

| ‘for”(”;”;’exp’)’stat

| ‘for”(”;”;”)’stat

(|表示OR)。

编译程序时,词法分析器(编译器的一部分)检查您的代码是否在语法上正确(即符合forms语法),并根据源代码执行其他操作。

…编译器(解析器)如何知道while中的空状态是错误而且是无限的?

因为语言定义在语法(语法)和语义中都指定了它。

这是while循环的语法:

 while ( expression ) statement 

这是for循环的语法(从C2011开始 ):

 for ( expression opt ; expression opt ; expression opt ) statement for ( declaration expression opt ; expression opt ) statement 

for语句中的每个expression opt中的下标opt表示相应的表达式是可选的。 文本强化了这一点:

6.8.5.3 for语句


2可以省略clause-1expression-3 。 省略的表达式-2由非零常量替换。

相比之下, while语句的控制表达式未标记为可选,这在文本中也得到了强化:

6.8.5.1 while语句

1控制表达式的评估在每次执行循环体之前进行。

没有多少空间可以解释控制表达式可能被省略。