对于C中的循环语法

时间:2016-06-16 09:38:19

标签: c for-loop

我在这里有一个奇怪的for循环语法:

for(--index ; index>=0 ; --index)     // (--index) instead of (forInit) 
{
    //code
}

我知道for语法是这样的:

for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

我们如何在循环中使用--index代替ForIniti。我认为我们只能在那个地方初始化变量,或者可以将它留空,如下所示:

for( ; index>=0 ; index--)
    {
      //code
    }

我之前没有介绍过这种语法。请解释为什么这在语法上是正确的。

6 个答案:

答案 0 :(得分:2)

N1570 6.8.5迭代语句中for语句的定义是:

  

for(表达式opt;表达式opt;表达式opt)语句
  for(declaration expression opt; expression opt)statement

允许所有三个字段都使用任意表达式,因此当然也允许使用表达式--index

答案 1 :(得分:1)

[ForInit]是一个表达式。任何表达。其他的也是如此,这使得for循环非常强大。

一个半常见的事情是使用它来逐步浏览链表:

struct node {
  struct node *next;
  void *data;
} *head, *iter;

for(iter = head; iter != NULL; iter = iter->next)
{
}

这使用[ForUpdate]部分(可能看起来很奇怪,但非常精细),它位于next链接之后,而不是在计数器上进行算术运算。

答案 2 :(得分:1)

在for init中,您可以初始化变量,如:     index = k, 并且     index = index + k或index = index -k, 在您的示例中,初始化很简单     index = index -1。

示例:

index= 10; 

for(--index ; index>=0 ; --index)    
{    
}

索引以值9开始,减少直到0。

答案 3 :(得分:1)

这只不过是

for(index = index - 1 ; index>=0 ; --index){
    //code
}

我不知道你在哪里找到了提到的for语法,但严格地说,你只需要在那里包含一个表达式(可能是空的)。

答案 4 :(得分:0)

使用此for语法:

for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

ForInit是循环开始时执行的表达式,因此,只对循环执行一次。

Expression是条件表达式,只有在计算结果为True或1或任何其他非零数字时,循环才会运行。

ForUpdate是每个循环体执行后执行的表达式。

此陈述不正确:

  

我认为我们只能在那个地方初始化变量或者可以   留空吧

你可以在这个(ForInit)地方有任何表达式,只有它会在循环开始时执行一次。

为什么这在语法上是正确的?

for( ; index>=0 ; index--) {
      //code
}

绝对正确,因为在for循环中,所有三个参数都是可选的。以下循环也是正确的,但它是无限循环:

for( ; ; ){
}

答案 5 :(得分:0)

C标准是松散的,因此允许您在3个for循环表达式中的任何一个中放置任何类型的废话(尽管中间的必须评估为算术类型,它不能是void表达式)。但这并不意味着你应该运行并在那里放置任何类型的垃圾,就像在这个写得很糟糕的代码中所做的那样。

你应该总是写这样的循环:

  • 第一个表达式应该只关注循环迭代器的声明和/或初始化。
  • 第二个表达式应该只包含循环条件。
  • 第三个表达式只应该与更改循环迭代器有关。

除了上述事实标准之外的任何其他内容都是非常糟糕的编程习惯。如果可能的话,你应该总是避免在3个表达式中的任何一个中出现任何形式的无关副作用。

还尝试将循环迭代器局部作用域保留到循环中。在这种情况下,您可以声明一个迭代器i(“i”代表迭代器)并将索引变量的值赋给它int i=index - 1;