在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 版本少了一次迭代。

仔细阅读,++countercounter++ 分别在循环体的开头或结尾将 counter 递增 1。在哪种情况下,至少在概念上,这不是一个相同的动作?因为一旦循环经过第一次迭代,循环的结束和开始就是一回事。

我唯一一次看到这会有所不同是在第一次迭代中,如果使用 counter++std::cout << counter << endl; 应该将 1 输出到控制台(因为 1 被添加到计数器循环结束)。如果使用 ++counterstd::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)?