我在这里有一个奇怪的for循环语法:
for(--index ; index>=0 ; --index) // (--index) instead of (forInit)
{
//code
}
我知道for
语法是这样的:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
我们如何在循环中使用--index
代替ForIniti
。我认为我们只能在那个地方初始化变量,或者可以将它留空,如下所示:
for( ; index>=0 ; index--)
{
//code
}
我之前没有介绍过这种语法。请解释为什么这在语法上是正确的。
答案 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;
。