这在c中意味着什么? for (; --i >= 0; )
。
计数器如何减少,与for( ; i>=0;--i)
答案 0 :(得分:3)
它们非常相似,但不一样!你必须要理解C中的for循环是如何执行的:
举个例子:
1 2, 5 4
| | |
v v v
for(i = 0; i < 5; i++) {
//Do something <-- 3
}
正如你所看到的,2,3,4,5是一个循环,直到条件为假
现在你应该清楚地看到for循环是如何执行的。现在的区别在于你的第一个例子:
int i = 5;
for (; --i >= 0; )
printf("%d\n", i);
输出结果为:
4
3
2
1
0
因为在第一次检查条件(第2点)之后,它执行for语句的代码块,并且我已经减少了。
在你的第二个例子中:
int i = 5;
for( ; i>=0;--i)
printf("%d\n", i);
输出结果为:
5 //See here the difference
4
3
2
1
0
在这里你得到了不同之处,因为它在第4点得到了减少,所以它第一次以值5运行。
答案 1 :(得分:2)
这些结构正式等同于
while (--i >= 0)
{
Body;
}
和
while (i >= 0)
{
Body;
--i;
}
你最好看到差异吗?
答案 2 :(得分:1)
通常,我们可以将任何for循环或while循环转换为一组带有goto的大多数线性语句。这样做可能有助于比较代码。
### for (; --i >= 0; ) { statements; }
; // Initializer statement
start:
bool condition = (--i >= 0); // Conditional
if (condition) { // If true, we execute the body as so:
statements; // The statements inside the loop
; // Empty increment statement
goto start // Go to the top of the loop.
}
### for( ; i>=0; --i) { statements; }
; // Initializer statement
start:
bool condition = (i >= 0); // Conditional
if (condition) { // If true, we execute the body as so:
statements; // The statements inside the loop
--i; // Increment statement
goto start; // Go to the top of the loop.
}
在第一种情况下,我们第一次递减i
之前每个循环体。在第二种情况下,我们在每个循环体后递减i
。
最简单的方法是考虑在i == 0
时进入此循环时会发生什么。在第一种情况下,在此代码块之后,您将得到i == -1
的结果值。在第二种情况下,i
不会改变(即i == 0
),因为我们从未达到增量语句。
答案 3 :(得分:0)
for (; --i >= 0; )
的工作原理如下:
如果你有i为10,它将减少i值并将比较9&gt; = 0等等。
所以输出就像9, 8... till 0
while循环for( ; i>=0;--i)
首先转到10,然后递减值,然后检查i&gt; = 0。因此输出为10, 9,8... till 0
答案 4 :(得分:0)
第一个递减i
,然后检查条件。
第二个先检查条件,如果为真,则在循环体执行后递减i
。
答案 5 :(得分:0)
initialization
中的三个参数(condition
,increment
和for
)是可选的(但仍需要逗号;
)。因此,您可以安全地编写此for(;;)
,它与while(1)
相同。所以,表达如下:
for(; x > y; x++) { ... }
for(;1;x++) { if(x > y) break;
for(;;) { if(x++ > y) break;
for(;x++ > y;) { ... }
有效且等效。在此,增量发生在条件参数中,就像在代码示例中一样。
答案 6 :(得分:0)
这就像说for( i=0 or some value; --i <= 0 ; do nothing){}
一样
而--i
是一个预先生成的运算符,意味着这段代码即--i
正在阅读中,i
的值将同时减少1
。
答案 7 :(得分:0)
for循环中有三个主要组件。
初始化,条件和事后的想法。
初始化在整个语句的开头发生一次。在每个周期之前发生条件。 在每个周期之后来了。考虑i
从2开始:
for (; --i >= 0; )
Initialization: i = 2
Condition: i = 1
Afterthought: i = 1
Condition: i = 0
Afterthought: i = 0
Condition: i = -1
Exit
在另一种情况下
for( ; i>=0;--i)
Initialization: i = 2
Condition: i = 2
Afterthought: i = 1
Condition: i = 1
Afterthought: i = 0
Condition: i = 0
Afterthought: i = -1
Condition: i = -1
Exit
你可以看到第二个版本实际上持续了一个周期!