跳转到主要内容

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

Plant Amber Pendant Long Necklace Clothing Jewelry

能进来的朋友肯定跟我一样对于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++的思考,希望对你有用。

另外,有个小伙伴提了一下用Vs2019编译的结果是1,后面我也借了一下编译器编译也是1。我发现可能有点儿问题啦。

 

 

对比了一下两个编译器的汇编代码,发现有点不一样,devc++符合我上述的描述,

 

这个用DevC++和VS2019编译后的结果不一样,Devc++是0,但是vs是1

玻璃钢生产厂家日照卡通玻璃钢雕塑河南走廊商场美陈价格彩绘玻璃钢雕塑批发户外玻璃钢雕塑摆件国内打造玻璃钢仿铜运动人物雕塑工厂铜陵商场装饰美陈江苏玻璃钢骆驼雕塑贺州玻璃钢塑料雕塑玻璃钢美女头像雕塑玻璃钢卡通雕塑超低价涡阳玻璃钢雕塑厂在哪里商场美陈 厦门玻璃钢人物雕塑特点乳山玻璃钢十二生肖雕塑运城花朵玻璃钢景观雕塑厂家仙游玻璃钢花盆花器商场圣诞节创意美陈浙江玻璃钢长颈鹿雕塑宁波玻璃钢雕塑定制玻璃钢雕塑吧台河北商场主题创意商业美陈制作玻璃钢雕塑济南新密花朵玻璃钢人物雕塑厂家内蒙古玻璃钢雕塑大全特色玻璃钢雕塑摆件制造商场美陈万圣节广州玻璃钢兔子雕塑专业的玻璃钢雕塑加工苏州中庭商场美陈郑州镂空校园玻璃钢雕塑定制厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化