这在c中意味着什么? for(; - i> = 0;)c

时间:2015-02-01 16:05:11

标签: c loops

这在c中意味着什么? for (; --i >= 0; )

计数器如何减少,与for( ; i>=0;--i)

有何不同

8 个答案:

答案 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的大多数线性语句。这样做可能有助于比较代码。

案例1

### 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.
  }

案例2

### 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中的三个参数(conditionincrementfor)是可选的(但仍需要逗号;)。因此,您可以安全地编写此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

你可以看到第二个版本实际上持续了一个周期!