今天同学给我看了个题,题目如下:
int i = 1;
int j = i++;
System.out.println(j);
以前没关注过此类问题,单纯认为java中i++就是先运算后赋值,++i就是先赋值后运算。而上述代码结果为1,于是去网上学习了相关知识。
知乎上有个用反编译观察底层源码的,我相关知识还没掌握,就不做讲述了,就讲讲简单通俗的。
在java中可以把++i理解为先自增,然后返回增加后的值。i++理解为先自增然后返回增加前的值,底层源码也是这样的,返回的依然是增加前的值。同时变量也是一个表达式,表达式的运算规则是从左到右的。
所以上述代码,int j = i++先自增然后返回自增前的值,结果还是1。同理再看几题。
int i = 1;
int j = i++ + ++i;
System.out.println(j);
根据上述原理,先对i++运算,i先自增再返回自增前的值,表达式变为int j = 1 + ++j,此时i已经变为了2,再对i自增,返回自增后的值,结果为3,所以最后表达式为1+3=4.
int i = 1;
int j = (2 * i++) + i;
System.out.println(j);
此题首先从左到右运算,先算括号内的,(2 * i++),i++ 首先i自增返回自增前的值,为1,表达式变为(2 * 1),此时i已经变为了2,所以结果为2 + 2 = 4.
int i = 1;
int j = i + (2 * i++);
System.out.println(j);
此题同理,从左到右,i = 1,所以表达式变为int j = 1 + (2 * i++),后面仍然为(2 * 1),所以结果为3.