需要更好地理解循环 - 后增量运算符

Raj*_*war 14 c++ for-loop

对于我总是用于循环的post增量运算符,我并不是很清楚.我对post增量运算符的最新和新获得的理解如下:

int a = 5
int b = a++ //a will increment and return back its old value 5
so b = 5
Run Code Online (Sandbox Code Playgroud)

有了这些新知识,我决定理解/应用于我常用的后增量运算符的地方for.现在好像我迷失了,因为理论上我输错了输出

请考虑以下代码

for(int i=0 ; i< 3 ; i++)
{
  std::cout << i; 
}
Run Code Online (Sandbox Code Playgroud)

第一个循环

i starts with 0 which is less than 3 so ( increment by 1 however since its i++ it returns old value 0) 
so cout should display 1 // But it displays 0
Run Code Online (Sandbox Code Playgroud)

第二圈

 i is now 1 which is less than 3 so i++ is applied - Now i is 2 and returns back 1
 so cout should display 2 //But it display 1
Run Code Online (Sandbox Code Playgroud)

第三圈

 i is now 2 which is less than 3 so i++ is applied - Now i is 3 and returns back 2
 so cout should display 3 //But it display 2
Run Code Online (Sandbox Code Playgroud)

第四循环

 i is now 3 which is not less than 3 so loop exits
Run Code Online (Sandbox Code Playgroud)

任何人都可以清楚我的理解并指出我正确的方向.输出应该是0,1,2我哪里出错了?

pax*_*blo 34

您遗漏的是for声明的每个部分发生时:

for (int i = 0 ; i < 3 ; i++)
//   111111111   22222   333
Run Code Online (Sandbox Code Playgroud)
  • 第一位在任何迭代完成之前发生一次.
  • 在每次潜在迭代之前评估第二个表达式,如果为false,则不再进行进一步的迭代.
  • 第三位在每次迭代结束时完成,然后返回以评估第二位.

现在仔细阅读最后一个要点.这i++是在迭代结束后完成cout << i.并且,在此之后,立即检查继续条件(第二部分).

所以循环实际上与以下相同:

{   // Outer braces just to limit scope of i, same as for loop.
    int i = 0;
    while (i < 3) {
        cout << i;
        i++;
    } 
}
Run Code Online (Sandbox Code Playgroud)

就是你得到原因0 1 2.

  • @esskar不是它'不是http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c (13认同)
  • @ Co.Aden因为语言规范是这样说的.`for`是带有语法糖的`while`,因为它是一种常见的构造,可以做增量等操作.参见"C编程语言第2版"的第60页(第3.5章).(或者是Bjarne Stroustrup关于C++的书中的相应位置). (8认同)

Jac*_*all 6

for循环中的分号分隔三个不同的表达式.第三个表达式与循环的行为无关.你可以替换i++,++i你的循环会表现相同; 无论哪种方式,i都会增加1.

要观察增量运算符的行为,请考虑以下循环:

for(int i = 0 ; i++ < 3 ; ) cout << i;
/*                      ^^^ Nothing here!                      */
Run Code Online (Sandbox Code Playgroud)

请注意,第三个表达式为空.123跳过输出-0是因为测试(包括增量)在循环的每次迭代之前发生.

与使用preincrement运算符的类似循环相比,后增量循环的行为如何?

for(int i = 0 ; ++i < 3 ; ) cout << i;
Run Code Online (Sandbox Code Playgroud)

现在输出为12-3不打印,因为条件测试3一旦增加到该值就看到该值,因此循环退出.