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

时间:2014-09-25 08:55:18

标签: c++ for-loop

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

int a = 5
int b = a++ //a will increment and return back its old value 5
so b = 5

有了这些新知识,我决定理解/将它应用到我常用的后增量运算符的地方,就像for循环一样。现在好像我迷路了 因为理论上我的输出结果是错误的

考虑以下代码

for(int i=0 ; i< 3 ; i++)
{
  std::cout << i; 
}

第一次循环

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

第二圈

 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

第三圈

 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

第四循环

 i is now 3 which is not less than 3 so loop exits

有谁可以请理解我的理解并指出我正确的方向。 输出应该是0,1,2我哪里出错?

3 个答案:

答案 0 :(得分:34)

for语句的每个部分发生时

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

现在仔细阅读最后一个要点。 i++在迭代的 end 完成,在<{em> cout << i之后完成。并且,在此之后,立即检查继续条件(第二部分)。

所以循环实际上与:

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

那是你获得0 1 2的原因。

答案 1 :(得分:6)

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

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

for(int i = 0 ; i++ < 3 ; ) cout << i;
/*                      ^^^ Nothing here!                      */

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

后增量循环与具有preincrement运算符的类似循环相比如何表现?

for(int i = 0 ; ++i < 3 ; ) cout << i;

现在输出为12 - 3不会打印,因为条件测试会在递增到值时看到值3,因此循环退出。

答案 2 :(得分:3)

您只需要知道语句int i = 0首先执行,即i首先取值0,检查条件是否为真,然后执行循环体。

然后,i递增。