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

时间:2012-10-30 20:07:45

标签: c loops

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

但是当我删除条件部分

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

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

我没有发现任何关于此的内容,我认为C中喜欢我(初学者)的人可能会有同样的困惑

5 个答案:

答案 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)。

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