在for循环中,pre/post-incrementing一个循环控制变量在迭代总数方面有区别吗?
In a for loop, is there a difference between pre/post-incrementing a loop control variable in terms of the total quantity of iterations?
当我编译 运行 下面的代码时,用 counter++
或 ++counter
代替 x
,输出是相同的;在这两种情况下,数字 1 - 10:
for (int counter = 1; counter < 11; x)
{
std::cout << counter << endl;
}
最初我认为 ++counter
会递增 1,然后 return 计算循环头中的布尔表达式之前的新值。即当以 counter = 1
开始并使用 ++counter
时,counter
在布尔表达式中的值为 2。这似乎不是这种情况,因为两个输出是相同的,而不是像我预期的那样 ++counter
版本少了一次迭代。
仔细阅读,++counter
和 counter++
分别在循环体的开头或结尾将 counter
递增 1。在哪种情况下,至少在概念上,这不是一个相同的动作?因为一旦循环经过第一次迭代,循环的结束和开始就是一回事。
我唯一一次看到这会有所不同是在第一次迭代中,如果使用 counter++
,std::cout << counter << endl;
应该将 1 输出到控制台(因为 1 被添加到计数器循环结束)。如果使用 ++counter
,std::cout << counter << endl;
应该将 2 输出到控制台(因为在循环开始时将 1 添加到计数器)。
除了上面的问题,能否请您准确解释一下for循环头中三个动作的求值顺序,并准确解释一下使用i++
和[=28时迭代发生的位置=].
非常感谢!
没有区别。在旧的编译器中,++counter
更快,因为它没有创建临时变量,但所有现代编译器都可以优化它。对于具有自定义(非内联)增量运算符的重对象,++counter
仍然可以更有效。
至于何时进行评估:
for (initialization; condition; increment/decrement)
code;
被评估为
{
initialization;
while (condition)
{
code;
increment/decrement;
}
}
C++ for 循环可能粗略地 被视为以下语法糖(使用您的示例):
int counter = 1;
while (counter < 11)
{
std::cout << counter << endl;
x;
}
所以,先执行初始化语句,每次迭代前执行条件表达式,每次迭代结束时执行自增语句
我们可以在这里看到,使用 post-increment 或 pre-increment 运算符对循环逻辑没有影响,尽管可能存在其他差异(post-increment 实际上需要保留一个副本变量的旧值,因为它是表达式的值,它有一些相关的成本,请参阅 Preincrement faster than postincrement in C++ - true? If yes, why is it?).
counter++ 复制增加计数器和returns值
++counter 增加计数器和 returns 计数器。
在循环中
for(initialization;condition;increment/decrement)
{body;}
increment/decrement 是循环的最后一行。所以它会在 increment/decrement returns 一个值时再次开始循环。所以post-increment或pre-increment不会影响这里。看到这个
What is the difference between pre-increment and post-increment in the cycle (for/while)?
当我编译 运行 下面的代码时,用 counter++
或 ++counter
代替 x
,输出是相同的;在这两种情况下,数字 1 - 10:
for (int counter = 1; counter < 11; x)
{
std::cout << counter << endl;
}
最初我认为 ++counter
会递增 1,然后 return 计算循环头中的布尔表达式之前的新值。即当以 counter = 1
开始并使用 ++counter
时,counter
在布尔表达式中的值为 2。这似乎不是这种情况,因为两个输出是相同的,而不是像我预期的那样 ++counter
版本少了一次迭代。
仔细阅读,++counter
和 counter++
分别在循环体的开头或结尾将 counter
递增 1。在哪种情况下,至少在概念上,这不是一个相同的动作?因为一旦循环经过第一次迭代,循环的结束和开始就是一回事。
我唯一一次看到这会有所不同是在第一次迭代中,如果使用 counter++
,std::cout << counter << endl;
应该将 1 输出到控制台(因为 1 被添加到计数器循环结束)。如果使用 ++counter
,std::cout << counter << endl;
应该将 2 输出到控制台(因为在循环开始时将 1 添加到计数器)。
除了上面的问题,能否请您准确解释一下for循环头中三个动作的求值顺序,并准确解释一下使用i++
和[=28时迭代发生的位置=].
非常感谢!
没有区别。在旧的编译器中,++counter
更快,因为它没有创建临时变量,但所有现代编译器都可以优化它。对于具有自定义(非内联)增量运算符的重对象,++counter
仍然可以更有效。
至于何时进行评估:
for (initialization; condition; increment/decrement)
code;
被评估为
{
initialization;
while (condition)
{
code;
increment/decrement;
}
}
C++ for 循环可能粗略地 被视为以下语法糖(使用您的示例):
int counter = 1;
while (counter < 11)
{
std::cout << counter << endl;
x;
}
所以,先执行初始化语句,每次迭代前执行条件表达式,每次迭代结束时执行自增语句
我们可以在这里看到,使用 post-increment 或 pre-increment 运算符对循环逻辑没有影响,尽管可能存在其他差异(post-increment 实际上需要保留一个副本变量的旧值,因为它是表达式的值,它有一些相关的成本,请参阅 Preincrement faster than postincrement in C++ - true? If yes, why is it?).
counter++ 复制增加计数器和returns值
++counter 增加计数器和 returns 计数器。
在循环中
for(initialization;condition;increment/decrement)
{body;}
increment/decrement 是循环的最后一行。所以它会在 increment/decrement returns 一个值时再次开始循环。所以post-increment或pre-increment不会影响这里。看到这个
What is the difference between pre-increment and post-increment in the cycle (for/while)?