为什么这个循环永远持续下去?

时间:2019-04-30 09:58:26

标签: c for-loop

int main() {
        for(3;2;1)
            printf("hello\n")
}

我认为甚至不会执行此循环。 AFAIK我们必须定义一个变量;提出条件增加减少。但是在这段代码中,我所算的东西都不存在。因此,我认为该程序应该崩溃。但它会永远持续下去。

6 个答案:

答案 0 :(得分:4)

因为退出条件(2)始终为真。

这行得通,因为for语句的格式为

for (clause-1;expression-2;expression-3)

clause-1可以是声明(例如int i = 0)或表达式。

在您的情况下,您有三个表达式,因此该语句在语法上仍然有效。

expression-2的计算结果为false(0)时,该循环退出。在您的情况下,由于它是一个非零常数(2),因此它永远不会执行。

答案 1 :(得分:3)

停止条件表达式2永远不会为零。

所以循环永远运行。

答案 2 :(得分:2)

C不是for i in 3 2 1 ; do echo hello ; done

中的Bourne外壳

正确的循环是这样的:

#include <stdio.h>
int main() {
        for(int i = 1; i <=3 ; i++)
            printf("hello\n");
}

在这里,条件表达式i <= 3并不总是像2那样正确。 True是任何非零值。

答案 3 :(得分:2)

  

AFAIK我们必须定义一个变量;提出条件增加减少。但是在这段代码中,我所算的东西都不存在。因此,我认为该程序应该崩溃。但它会永远持续下去。

在学习for循环时,您可能会接触到非常特殊的循环用法,因此可以推断出在语法上可能出现或不出现的内容。但是您并没有掌握全部情况。该C语言有一个标准,该标准定义了如何编写循环以及循环的行为。对于循环,我们可以查看§6.8.5(迭代语句)以确定正确的行为:

  iteration-statement:
          while ( expression ) statement
          do statement while ( expression ) ;
          for ( expressionopt ; expressionopt ; expressionopt ) statement
          for ( declaration expressionopt ; expressionopt ) statement

这是所有循环的语法。看看for循环如何在所有3个地方允许一个任意表达式?因为甚至123都是C中的表达式,所以它们可以去那里。该标准甚至告诉我们该行为是什么:

  

迭代语句使称为循环体的语句重复执行,直到控制表达式的值等于0为止。

     

声明

for ( clause-1 ; expression-2 ; expression-3 ) statement
     

表现如下:表达式expression-2是在每次执行循环主体之前求值的控制表达式。

因此,2必须得到评估,并与等于0的值进行比较。它将永远不会发生,因此您会观察到这种行为。

答案 4 :(得分:1)

我们知道0为假,1为真。在这种情况下,条件语句中的for( ;2;)始终像while(2)一样为真。因此它将无限运行。

答案 5 :(得分:1)

for循环不需要要求使用任何变量。它仅指定使用三个表达式,每个表达式都是可选的:

for ( expression-1opt ; expression-2opt ; expression-3opt ) statement

首先,评估 expression-1 (如果存在)。此表达式通常会初始化我们要在 expression-2 中测试的条件,但没有

接下来,评估 expression-2 。如果表达式的结果不为零,则将执行循环体。如果 expression-2 不存在,则将其隐式替换为1

执行循环体后,将评估 expression-3 。此表达式通常会更新我们在 expression-2 中测试的条件,但同样,它没有

重复最后两个步骤,直到 expression-2 的值为零。

对于for ( 1; 2; 3 ) ...2的计算结果为非零,因此循环体执行。由于该值永远不变,因此循环“永远”运行。使用for (;;)可获得相同的结果。