while(cond) // fine
for(;cond;) //fine
但是当我删除条件部分
时while() //syntax compilation error
for(;;) //Infinite loop
这些循环如何在内部实施?
或者,编译器(解析器)如何知道while
中的空状态是错误,而for
中的空状态是无限的?
我没有发现任何关于此的内容,我认为C中喜欢我(初学者)的人可能会有同样的困惑
答案 0 :(得分:11)
该标准要求将for
循环的省略条件替换为非零常量:
来自 C11 6.8.5.3 :(强调我的)
6.8.5.3 for语句
1(第-1条;表达式-2;表达式-3)的陈述 语句的行为如下:表达式表达式-2是 控制在每次执行之前计算的表达式 循环体。表达式-3被评估为空白 每次执行循环体后的表达式。如果第1条是a 声明,它声明的任何变量的范围是余数 声明和整个循环,包括其他两个 表达式;它是在第一个之前按执行顺序到达的 评估控制表达。如果第1条是一个 表达式,它在第一个之前被计算为void表达式 控制表达式的评估.134)
2可以省略子句-1和表达式-3。省略的表达式-2由非零常量替换。
由于while
循环没有这样的要求(如果条件被省略),我相信,它留给了编译器的实现。
答案 1 :(得分:3)
没有技术原因可以解释为什么一个有效,另一个没有。这是语言设计者的人为因素考虑因素。他们认为使用for (;;)
的无限循环比while ()
更有意义。他们可能受到ALGOL的影响,ALGOL是一种由穴居人使用的语言。
答案 2 :(得分:3)
...编译器(解析器)如何知道while中的空状态是错误而且是无限的?
因为语言定义在语法(语法)和语义中都指定了它。
以下是while
循环的语法:
while ( expression ) statement
这是for
循环的语法(从C2011开始):
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement
expressionopt
语句中每个for
中的下标 opt 表示相应的表达式是可选的。文本强调了这一点:
6.8.5.3 for语句
...
2 clause-1 和 expression-3 都可以省略。省略的表达式-2 由a替换 非零常数。
相比之下,while
语句的控制表达式未标记为可选,这在文本中也得到了加强:
6.8.5.1 while语句
1控制表达式的计算在每次执行循环体之前进行。
没有多少空间可以解释控制表达式可能被省略。
答案 3 :(得分:2)
确定程序的语法和语义正确性的条件被编码为语言语法。语言语法由语言创建者制作,它们决定语言的外观,就像C语言一样。
我认为for(;;)
和while(1)
背后的基本直觉是for(;;)
的任何部分都可以省略,尽管while(1)
完全足以创建无限循环,而while()
对于一个狭隘的案件来说,这将是一个黑客的角落案件。
答案 4 :(得分:2)
这是C语法的一部分。每种编程语言都有其正式的语法规范(这里是C formal grammar in BNF - 即什么是语法正确和什么不是。在C形式语法中你可以看到而必须看起来像:
'while''('exp')'stat
单引号(终端符号)中的单词/符号是强制性的:'while','('和')'。 非引用的单词(非终结符号)是某种,也是在形式语法中指定的。如果您分析了C形式语法,您会看到exp 不能 nothing 。另一方面,如果您查看 ,您会看到它看起来像:
'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)。
编译程序时,词法分析器(编译器的一部分)检查您的代码在语法上是否正确(即符合形式语法),并根据源代码执行其他操作。