能进来的朋友肯定跟我一样对于count = count++的结果很不解,希望看完你有收获。

先看一段代码
public class CountTest { public static void main(String[]args) { int count =
0; //初始化count为0 for(int i=1;i<=100;i++) { //遍历100次 count = count++; }
System.out.println("count = "+count); //输出count } }
代码中,count被初始化为0,然后经历了100次 count=count++ ,那输出的答案肯定等于100呀。后自增不就是这样子的吗。其实不然,答案是 0

我曾经得出答案等于100的其中一个原因是,count++是后++,肯定是先把count的值赋值给count然后在count+1嘛(错误的),恭喜你,你也跟我一样入坑了。因为我也是这样子想的。

我确实想了很多种不对头的方式,仍旧无法得出正确答案,当我沉迷于百思不得求解的时候,我开始怀疑了我对于count++的理解。难道不是count先赋给左值然后在+1吗(错误的)
?  对,最后我发现就是这里错了。

下面是对于我对count = count++的探索。

1. 后++和 赋值=的优先级。

我曾经学习C语言和C++的时候,每次遇到j = i++的时候,是这样理解的,首先把i的值赋值给j 然后i=i+1. 现在我发现
++的运算优先级高的仅此于(),说明++的运算优先级是非常高了,而赋值=的运算优先级很低,低到什么程度,比||都低,那我之前想的先赋值在++,是不是不对劲呀。在绝对高的优先级下似乎=不堪一击?那么难道是先i+1然后赋值给了j吗,那这个不就是j=++i了吗,这哪里是j
=i++。笑死,这个时候我就发现我只找到了一半的原因,对于count =
count++还在执迷不悟中。于是,我想起了一本红书,《C++面向对象程序设计(第二版)》谭浩强中的运算符重载不是讲过后++吗。没错,就是它!

2.C++运算符重载能扯到这吗?

如果真的对于count
=count++困扰了很多的(比如我),就一起翻到C++面向对象程序设计中的第138页的那个例子(下面)。当然,网上也有很多对于后置自增运算符重载的实例,你也可以去看看。
Time Time ::operator ++ (int ) { Time temp(*this); sec++; if(sec>=60) {
sec-=60; ++minute; } return temp; }
如果看不懂没关系,注意看的就是好像代码要返回的是一个Time类,然后代码中出现了一个 Time  temp(*this),在sec++,然后返回了temp
。哦豁,用一个临时变量保存了当前的对象本身,然后sec+1了,最后返回了保存的对象本身,之所以要保留对象本身是因为sec+1会导致Time对象本身会改变返回的值。我似乎有一点理解了。它是用了一个临时变量存储了这个对象,然后在返回了这个对象。

相对于count = count ++的话,就是说用了一个temp保存了count的初始值,然后count+1了,但是赋值给count的是temp .
也就是说是先加了然后在赋值的,但又没完全是,赋值的是一个临时保存的count。

3. 对于j = i++的举例

下面我也将类比一下j = i++的求解过程。
public class CountTest { public static void main(String[]args) { int i = 0;
int j = 0; j = i++; System.out.println("i = "+i); //输出为1 System.out.println("j
= "+j); //输出为0 } }
i,j初始化都为0 ,首先出现了一个int temp 变量保留了i(=0)的值,然后i =i+1 ,最后temp赋值给了 j。就没了。
j变成了初始值的i,i变成i+1了,

j = i++类比于count = count++,就是出现了temp保存了count的初始值,然后count+1了,最后temp赋值给了count。
右值count的值在++之前被保存到了temp,然后右值的count本来自身要+1,就是count=1了,但到最后要完成count=赋值操作,把temp保存的count初始值又赋值给了左值。就像count变了,但又没变
;

因此在实际的编程可不要犯了这个小细节,导致程序运行不尽人意哦。

上述就是我对于count = count++的思考,希望对你有用。

上述只适用于java环境。在c/c++环境中,不同编译器会导致对于该代码有自己的处理方式,会导致运行结果不同。

 

 

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信