在for循环中,根据迭代总量,在循环控制变量的前/后递增之间是否存在差异?

iza*_*aak 6 c++ for-loop increment pre-increment post-increment

当我用下面的代码编译并运行代码counter++++counter替换时x,输出是相同的; 在这两种情况下,数字1 - 10:

for (int counter = 1; counter < 11; x)
{
    std::cout << counter << endl;
}
Run Code Online (Sandbox Code Playgroud)

最初我认为++counter会增加1,然后返回新值,然后在循环头中评估布尔表达式.即,当使用counter = 1和使用时++counter,counter布尔表达式中的值为2.这似乎并非如此,因为两个输出都是相同的,而不是++counter像我预期的那样具有少一次迭代的版本.

在周围读取时,它分别在循环体的开始或结束处出现++countercounter++递增counter1.在这种情况下,至少在概念上,这不是一个相同的行动吗?因为一旦循环超过第一次迭代,循环的结束和开始是相同的.

我唯一能看到这个有所作为的是第一次迭代,std::cout << counter << endl;如果counter++使用的话,应该输出1到控制台(因为在循环结束时将1添加到计数器).虽然std::cout << counter << endl;应该输出2到控制台如果++counter被使用(因为1被添加在循环的开始到计数器).

除了上面的问题,你能否准确地解释在for循环标题中评估三个动作的顺序,并准确地解释使用i++和时迭代发生的位置++i.

非常感谢!

Ste*_*oft 15

没有区别.在较旧的编译器中,++counter速度更快,因为它没有创建临时变量,但所有现代编译器都可以优化它.对于具有自定义(非内联)增量运算符的重对象,++counter仍然可以更高效.

至于何时进行评估:

for (initialization; condition; increment/decrement)
    code;
Run Code Online (Sandbox Code Playgroud)

被评估为

{
    initialization;
    while (condition)
    {
        code;
        increment/decrement;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

C++ for循环可以粗略地被认为是以下的语法糖(使用您的示例):

int counter = 1;
while (counter < 11)
{
    std::cout << counter << endl;
    x;
}
Run Code Online (Sandbox Code Playgroud)

因此,首先执行初始化语句,在每次迭代之前执行条件表达式,并在每次迭代结束时执行递增语句.

我们可以在这里看到,使用后增量或预增量运算符对循环逻辑没有任何影响,尽管可能存在其他差异(后增量实际上需要保留变量的旧值的副本,因为它是值表达式有一些相关的成本,在C++中看到Preincrement比后增量更快 - 是吗?如果是,为什么呢?).