飞道的博客

如何理解count=count++,count的值不变

181人阅读  评论(0)

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

先看一段代码


  
  1. public class CountTest {
  2. public static void main(String[]args) {
  3. int count = 0; //初始化count为0
  4. for( int i= 1;i<= 100;i++) { //遍历100次
  5. count = count++;
  6. }
  7. System.out.println( "count = "+count); //输出count
  8. }
  9. }

代码中,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页的那个例子(下面)。当然,网上也有很多对于后置自增运算符重载的实例,你也可以去看看。


  
  1. Time Time ::operator ++ ( int )
  2. {
  3. Time temp(*this);
  4. sec++;
  5. if(sec>= 60)
  6. {
  7. sec-= 60;
  8. ++minute;
  9. }
  10. return temp;
  11. }

如果看不懂没关系,注意看的就是好像代码要返回的是一个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++的求解过程。


  
  1. public class CountTest {
  2. public static void main(String[]args) {
  3. int i = 0;
  4. int j = 0;
  5. j = i++;
  6. System.out.println( "i = "+i); //输出为1
  7. System.out.println( "j = "+j); //输出为0
  8. }
  9. }

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++的思考,希望对你有用。后面我也测了一下,比较新的C++编译器也是出现了count = 0的结果


转载:https://blog.csdn.net/wasane/article/details/116800588
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场