经典面试题

来源:互联网 发布:杨修之死 知乎 编辑:程序博客网 时间:2024/05/16 18:31

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


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



原创粉丝点击