事前与事后增加

时间:2019-05-17 05:08:57

标签: c++ c++14

我获得了前后增量的基础,但是当实际发生在后期增量上时,我却难以下定决心。

例如下面的帖子增量代码:

int counter = 10;
int result = 0;

result = counter++ + 10;

cout << "Counter: " << counter << endl;
cout << "Result: " << result << endl;

我了解到Counter将以11的形式出现,结果为20。是Result是20的形式出现,因为正在运行整个函数,并且 THEN 在程序进入时会加+1。返回0; ?

确切何时添加+1?

谢谢

3 个答案:

答案 0 :(得分:6)

  

确切何时添加+1?

根据standard

  

++表达式的值计算在修改操作对象之前进行排序。

从外行的角度来看:

  1. counter的计算是有序的,它可以是语句的整个RHS的一部分,也可以只是术语counter++的一部分。
  2. 在对程序中的下一条语句进行排序之前,对counter += 1的计算进行排序。

有两件事要记住。

  1. 术语的值-它在表达式中的计算结果。
  2. 该术语评估的副作用。

对于counter++

该术语的值是counter的值在递增之前。
评估该术语的副作用是counter的值增加。

答案 1 :(得分:3)

后递增运算符::在完全执行使用后递增的表达式之后,使用后递增运算符来递增变量的值。在“后递增”中,值首先在表达式中使用,然后递增。

所以就您而言

result = counter++ + 10;

后递增在此语句中使用后发生,并且显然会在下一个语句中反映出来。

答案 2 :(得分:3)

为了更好地理解,您可以考虑以下宽松描述的示例:

  • 考虑the_objectthe_type pre 增量,就像这样一个函数:
the_object = the_object + 1;
return the_object;
  • 现在将the_object的{​​{1}}的 Post 增量视为这样的函数:
the_type

现在考虑:

the_type backup_of_the_object;
backup_of_the_object = the_object;
the_object = the_object + 1;
return backup_of_the_object;

正在编译程序时:

  1. 编译器在行首看到result = counter++ + 10; ,因此 首先应确定放置在result =右侧的内容 然后生成机器码以将其分配给 =,即=
  2. 编译器看到result,但语句尚未结束 因为尚未达到counter。所以现在知道了 还必须与;做些事情。
  3. 编译器看到counter,但该语句尚未结束。所以现在 知道必须考虑产生机器代码才能执行 首先++

  4. 编译器看到counter++。所以现在它知道必须考虑 生成机器代码以添加+的右侧和 +的左侧,即+

  5. 编译器看到counter++,最后该语句结束了。所以现在 它知道所有需要知道的信息!它知道生产后 执行10;的机器代码,它应该产生 机器代码以将10添加到 结果 中。那应该 产生机器码以将 outcome_of 分配给 counter++

程序运行时:

  1. CPU应该执行result

现在counter++加1,因此它是 11 ,但是 结果 counter)是counter++的先前值为 10

  1. CPU应该执行 结果 counter)+ 10

现在 结果 结果 counter++)+ 10)为 < em> outcome_of (10 + 10),即 20

  1. CPU应该执行counter++ 结果 结果 result = + 10)

现在counter++ 20

还请注意,所描述的每个阶段都只是关于
 result
不管之后会发生什么。之前的意思

result = counter++ + 10;

很显然,在cout << "Counter: " << counter << endl; cout << "Result: " << result << endl; 返回0之前。

我认为您应该放轻松,并通过编写和运行一些程序来从经验中学到它!

祝你好运!