经典面试题

今天,我看见一道题,特别有趣


public static void main(String[] args) {
		
		int a=4;
		System.out.print((a++)+(++a)+(a*10));
	}



求输出什么



最开始,我从左往右依次加上去发现结果是49,后来运行发现结果是70

后来想了一下,发现了一些关于操作符的运算细节


++a;  //会先自增,然后返回值

a++; //会先返回值,然后自增


我们来分析下这个表达式

(a++)+(++a)+(a*10)

底层在计算表达式的时候,会将各个需要进行计算的表达式进行计算,然后再加起来





所以,先计算第一个表达式  a++

CPU计算值后放到了自己的缓存里,如果变量 a 里面有值,就需要进行擦除,然后放到变量a 所属的那块内存里

不过这里 ++ 运算符放到了变量 a 的后面,就先返回值,然后自增,所以第一个表达式返回了  4。不过它的值在返回后,底层将它的地址里的值擦除了,然后从CPU的缓存区里拿到计算好的值,再放到变量a所属的内存里。也就是说这里a已经变成5了,只是将自增前的结果返回了


然后我们分析第二个表达式 ++a

底层会先从 变量 a 的地址里找它的值,这里已经进行自增了,然后又进行自增,然后返回,这里a就变成了6


然后我们分析第三个表达式 a*10

这里a的值已经完成两次自增,赋值成6了,然后我们计算6*10,就得到了结果60



然后底层又计算整个表达式 4+6+60

从左往右依次相加,我们就得到了结果70



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值