for(; max != 0 ; max/=10, pow10*=10)
从维基页面上拉出这个" Radix sort。"我没见过以前用分号开头的循环。编译器没有抓住它,所以我假设它是合法的。谁能解释一下?
另外,由于我只编写了相当简单的循环,我没有意识到你可以进行多项任务(正确的词?),例如" max / = 10,pow10 * = 10&#34 ;在for()语句的末尾...这有什么限制吗?形式不好?
谢谢你们! (并原谅我可能错误的词汇......早了,我需要更多咖啡......)
答案 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 (;;)
将永远循环,除非其中包含break
,return
,throw
或goto
。
这有什么限制吗?形式不好?
“逗号运算符”可用于评估多个表达式;可以有多少你喜欢的,他们将按顺序进行评估。它通常被认为是使用多个语句的更好形式,除非在这种情况下只有一个语句是可能的。
答案 2 :(得分:1)
对于问题的第二部分,您可以使用comma operator
执行多个语句。请阅读http://en.wikipedia.org/wiki/Comma_operator以获取更多信息。
答案 3 :(得分:1)
for循环有三个以分号分隔的元素,都是可选的。
在这种情况下,在第一次循环迭代之前没有执行任何操作,之前已经完成了所有操作。
对于最后一部分,他们使用的是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 变量,max
和pow10
。但是,for
循环允许零或一个声明。出于文体方面的原因,编码人员将这两个分区放在同一个地方,直接在for
循环之前。