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

本文探讨了Java代码中count=count++为何结果为0的迷惑性问题,解析了后置自增运算符的优先级和运算过程,通过类比和C++的运算符重载概念来阐述其工作原理,并提供了示例代码帮助理解这一常见编程陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

能进来的朋友肯定跟我一样对于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++环境中,不同编译器会导致对于该代码有自己的处理方式,会导致运行结果不同。

 

 

 

评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanxinji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值