奇怪的标记:for(; max!= 0; max / = 10,pow10 * = 10)

时间:2012-03-13 13:01:06

标签: c++ loops syntax

for(; max != 0 ; max/=10, pow10*=10)

从维基页面上拉出这个" Radix sort。"我没见过以前用分号开头的循环。编译器没有抓住它,所以我假设它是合法的。谁能解释一下?

另外,由于我只编写了相当简单的循环,我没有意识到你可以进行多项任务(正确的词?),例如" max / = 10,pow10 * = 10&#34 ;在for()语句的末尾...这有什么限制吗?形式不好?

谢谢你们! (并原谅我可能错误的词汇......早了,我需要更多咖啡......)

6 个答案:

答案 0 :(得分:4)

这完全合法。这是一个带有空初始化块的for循环。

最典型的for循环看起来像这样:

for (int i = 0; i < size; i++) {
  ...
}

这(几乎)等同于以下内容:

int i = 0;
for ( ; i < size; ) {
  ...
  i++;
}

(在第一种情况下,i的范围仅限于循环内,而在第二种情况下,i在循环后仍然可见,因为其范围是封闭块。)

For循环有三个块,用分号分隔:初始化循环条件循环增量。任何或所有这些都可以是空的。所以这也是合法的(导致无限循环):

for(;;)

答案 1 :(得分:3)

  

我没见过以前用分号开头的循环。

这只是意味着initialiser子句是一个空表达式 - 在第一次迭代之前没有做任何事情。如果您正在编写的循环不需要它们,那么其他两个子句也可以留空。例如,for (;;)将永远循环,除非其中包含breakreturnthrowgoto

  

这有什么限制吗?形式不好?

“逗号运算符”可用于评估多个表达式;可以有多少你喜欢的,他们将按顺序进行评估。它通常被认为是使用多个语句的更好形式,除非在这种情况下只有一个语句是可能的。

答案 2 :(得分:1)

对于问题的第二部分,您可以使用comma operator执行多个语句。请阅读http://en.wikipedia.org/wiki/Comma_operator以获取更多信息。

答案 3 :(得分:1)

for循环有三个以分号分隔的元素,都是可选的。

  1. 开始循环的声明
  2. 留在循环中的条件
  3. 每次循环迭代后执行的语句。
  4. 在这种情况下,在第一次循环迭代之前没有执行任何操作,之前已经完成了所有操作。

    对于最后一部分,他们使用的是C / C ++的逗号运算符:逗号运算符表示执行两个语句,并返回最后一个语句。例如,int x = 4,5;int x = 5;相同。您可以使用它来运行多个语句,通常只允许一个语句。您列出的for循环是一个示例,或者您可以使用if语句执行类似的操作。

    char* s;
    int compare;
    
    if(s == NULL)
        ...
    else if(compare = strcmp(s, otherString), compare < 0)
        ...
    else if(compare > 0)
        ...
    

    这有时比这更具可读性:

    if(s == NULL)
        ...
    else
    {
        compare = strcmp(s, otherString);
        if(compare < 0)
            ....
        else if(compare > 0)
            ....
    }
    

答案 4 :(得分:0)

它只是一个空的init块。如果没有任何事情要做,你可以跳过for循环的任何部分(例如for(;;)是一个没有init且没有结尾的无限循环)。

答案 5 :(得分:0)

通常的原因是算法在循环之前声明变量,而不是循环内部,因此它也可以在循环外部使用。

在这种情况下,原因是不同的。 The loop使用 2 变量,maxpow10。但是,for循环允许零或一个声明。出于文体方面的原因,编码人员将这两个分区放在同一个地方,直接在for循环之前。