int main() {
for(3;2;1)
printf("hello\n")
}
我认为甚至不会执行此循环。 AFAIK我们必须定义一个变量;提出条件增加减少。但是在这段代码中,我所算的东西都不存在。因此,我认为该程序应该崩溃。但它会永远持续下去。
答案 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
正确的循环是这样的:
#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个地方允许一个任意表达式?因为甚至1
,2
和3
都是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 (;;)
可获得相同的结果。