今天,我看见一道题,特别有趣
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