为什么增量语句在C ++中的for循环中是一个东西?对我而言似乎是多余的,因为你可以简单地将增量放在条件代码中。我在这里误解了一些重要的事情吗?
为了更好地说明我的问题,我包括一些伪代码: 有什么区别 - >
for( int a = 10; a < 20; a = a + 1 )
{
cout << a << endl;
}
和
for( int a = 10; a < 20;)
{
a = a + 1
cout << a << endl;
}
答案 0 :(得分:8)
它有时不仅仅是方便。
这些是等价的:
for (int a = 10; a < 20; a = a + 1) {
cout << a << endl;
}
for (int a = 10; a < 20; ) {
cout << a << endl;
a = a + 1;
}
但是,这些不是:
// this works ...
for (int a = 10; a < 20; a = a + 1) {
if (blah ...)
continue;
cout << a << endl;
}
// this doesn't
for (int a = 10; a < 20; ) {
if (blah ...)
continue;
cout << a << endl;
a = a + 1;
}
由于您来自python,惯用 for循环就像一个python range
,但功能更强大。用Cthon表示的C for循环将是:
for a in range(10,20,1)
将此表达为:
更为惯用for (a = 10; a < 20; a += 1)
因为循环增量为1
,所以它甚至可以更多惯用语:
for (a = 10; a < 20; ++a)
但是,for循环是:
for ([init_stmt]; [test_stmt]; [incr_stmt])
任何* _stmt可以是复合:
for (x = 0, y = 0; x < 10; ++x, y += 2)
答案 1 :(得分:4)
便利。
但是,您的等效代码应为:
for (int a = 10; a < 20;)
{
cout << a << endl;
a = a + 1;
}
它在循环体的末尾运行。
答案 2 :(得分:3)
[对于现在删除/编辑的答案的质量抱怨抱怨;-)]
此:
for (unsigned counter = 1; counter <= 10; ++counter) {
doStuff();
}
基本等同于此:
unsigned counter = 1;
while (counter <= 10) {
doStuff();
++counter;
}
有一个值得注意的例外,在第一种情况下,counter
仅限于for
块内,并且一旦完成就自动超出范围,您将获得相当大的好处 - 对于后者,counter
必须在循环后保持在范围内,它可能是无用的,甚至是障碍。
(切向:注意C不支持 - for
声明,或任何非顶级声明,直到C99 - 但除非情有可原,否则任何人现在至少不使用C99一个可疑的选择imho。)
编辑:克雷格也对continue
提出了一个非常好的观点 - 这是一个经常被遗忘但肯定有用的陈述。我确信我们可能会想到其他差异。
答案 3 :(得分:1)
这个例子:
using namespace std;
int main(int argc, char** argv) {
for( int a = 10; a < 20;)
{
a = a + 1;
cout << a << endl;
}
return 0;
}
输出将是11 - > 20
第一个例子是10 - > 19
你正在将增量部分放在循环之外,这可能,但请注意,值10不会出现,因为你在打印a值之前增加 所以在第二个例子中你打印了值然后递增,并且在循环结束时,你退出循环而没有达到20,因为条件让你退出循环
在递增之前执行代码块是您的关键,在执行代码块之后的for循环递增
答案 4 :(得分:0)
嗯,这不是必需的,只是为了方便。 在你的第二个代码中,你犯了一个小错误,这会使代码与第一个代码不同。
您的增量应该在循环的末尾,以便等同于第一个代码 所以它应该是:
for( int a = 10; a < 20;)
{
cout << a << endl;
a = a + 1; //increment at the end of instructions
}
这些小错误以及忘记包含增量的错误是为什么在for循环中包含增量是方便的。
或者您可以使用while循环:
while (condition)
{//instructions here;}