繁体   English   中英

前与后增量

[英]Pre vs Post Increment

我得到了前后增量的基础,但是当它实际发生在后增量时,我无法理解。

例如,在以下增量后代码中:

int counter = 10;
int result = 0;

result = counter++ + 10;

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

我知道Counter会出现11,结果为20.结果是20,因为整个函数正在运行, 然后当程序返回0时加上+1;

究竟是什么时候加上+1?

谢谢

究竟是什么时候加上+1?

根据标准

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

从外行人的角度来看:

  1. counter计算进行排序,这可能是声明的整个RHS的一部分,或者只是counter++
  2. 在对程序中的下一个语句进行排序之前,对counter += 1计算进行排序。

要记住两件事。

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

counter++的情况下:

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

后增量运算符:后增量运算符用于在完全执行表达式后递增变量的值,其中使用后增量。 在Post-Increment中,值首先在表达式中使用,然后递增。

所以在你的情况下

result = counter++ + 10;

在本声明中使用后增量发生,显然它会在下一个语句中反映出来。

另外,为了更好地理解,您可以考虑这些松散描述的示例:

  • 认为对于前期 -Increment的the_objectthe_type作为这样的功能:
the_object = the_object + 1;
return the_object;
  • 现在想想 -Increment为the_objectthe_type作为这样的功能:
the_type backup_of_the_object;
backup_of_the_object = the_object;
the_object = the_object + 1;
return backup_of_the_object;

现在考虑:

result = counter++ + 10;

编译程序时:

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

  4. 编译器看+ 所以,现在它知道它必须考虑生产机器代码中加入右侧+和左侧+这是counter++

  5. 编译器见10; 最后声明已经结束。 所以现在它知道它需要知道的一切! 它知道,生产机器代码执行后, counter++ ,它应该产生的机器代码添加10到outcome_of它。 然后它应该生成机器代码以将result_of分配给result

程序运行时:

  1. CPU应该执行counter++

现在counter是由1因此它是11,outcome_of(递增counter++ )是以前的值counter10

  1. CPU应该执行outcome_ofcounter++ )+ 10

现在outcome_ofoutcome_ofcounter++ )+ 10)是outcome_of (10 + 10),即20

  1. CPU应该执行result = outcome_ofoutcome_ofcounter++ )+ 10)

现在result20

另请注意,所描述的每个阶段都只是关于
result = counter++ + 10;
不管之后会发生什么。 以前的意思

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

很明显在main()返回0之前。

在我看来,你应该放轻松,通过编写和运行一些程序的经验来学习它!

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM