我获得了前后增量的基础,但是当实际发生在后期增量上时,我却难以下定决心。
例如下面的帖子增量代码:
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?
谢谢
答案 0 :(得分:6)
确切何时添加+1?
根据standard:
++表达式的值计算在修改操作对象之前进行排序。
从外行的角度来看:
counter
的计算是有序的,它可以是语句的整个RHS的一部分,也可以只是术语counter++
的一部分。counter += 1
的计算进行排序。有两件事要记住。
对于counter++
:
该术语的值是counter
的值在递增之前。
评估该术语的副作用是counter
的值增加。
答案 1 :(得分:3)
后递增运算符::在完全执行使用后递增的表达式之后,使用后递增运算符来递增变量的值。在“后递增”中,值首先在表达式中使用,然后递增。
所以就您而言
result = counter++ + 10;
后递增在此语句中使用后发生,并且显然会在下一个语句中反映出来。
答案 2 :(得分:3)
为了更好地理解,您可以考虑以下宽松描述的示例:
the_object
中the_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;
正在编译程序时:
result = counter++ + 10;
,因此
首先应确定放置在result =
右侧的内容
然后生成机器码以将其分配给
=
,即=
。result
,但语句尚未结束
因为尚未达到counter
。所以现在知道了
还必须与;
做些事情。编译器看到counter
,但该语句尚未结束。所以现在
知道必须考虑产生机器代码才能执行
首先++
。
编译器看到counter++
。所以现在它知道必须考虑
生成机器代码以添加+
的右侧和
+
的左侧,即+
。
编译器看到counter++
,最后该语句结束了。所以现在
它知道所有需要知道的信息!它知道生产后
执行10;
的机器代码,它应该产生
机器代码以将10添加到 结果 中。那应该
产生机器码以将 outcome_of 分配给
counter++
。
程序运行时:
result
现在counter++
加1,因此它是 11 ,但是 结果 (counter
)是counter++
的先前值为 10
counter
)+ 10 现在 结果 ( 结果 (counter++
)+ 10)为 < em> outcome_of (10 + 10),即 20
counter++
结果 ( 结果 (result =
+ 10)现在counter++
是 20
还请注意,所描述的每个阶段都只是关于
result
不管之后会发生什么。之前的意思
result = counter++ + 10;
很显然,在cout << "Counter: " << counter << endl;
cout << "Result: " << result << endl;
返回0之前。
我认为您应该放轻松,并通过编写和运行一些程序来从经验中学到它!
祝你好运!