i++和++i的详细讲解
1、什么是“++”
“++”是一个复合赋值运算符,相当于给变量进行了加一这样的操作。i++或++i就相当于i=i+1.相信这个大家也很容易理解,简单说就是进行了一个小小的简化。
2、i++和++i的区别
(1)赋值顺序不同
++ i 是先加1后赋值,而i ++ 是先赋值后加1。也正是因为这种顺序差异,使得++i能够当作左值来使用,i++却不可。
(2)代码展示
@Test
void test2(){
int i=1;
i=i++;
//变量i的值1会先压入本地方法栈中,然后i在本地变量表中自增1变为2,最后再从栈中取出1赋值给i
System.out.println(i);//i=1
System.out.println("-----------------");
System.out.println(i);//i=1
//从左到右,i++,因为是后加加,所以i的值1会先压入本地方法栈,i自增1变为2;
// 接着++i,因为是前加加,所以i的值2会先自增为3,再压入栈中;
// 接着i++,i的值3先压入栈中,i再自增变为4;
// 接着++i,i的值4会先自增为5,再将5压入栈中;
// 最后,栈中的值1,3,3,5进行求和,赋值给a。
int a = i++ + ++i + i++ + ++i;
System.out.println("a=" + a + " i=" + i);//a=12 i=5
System.out.println("----------------");
//因为++的优先级大于比较或赋值,所以自增总是发生在比较或赋值运算之前的!!!
System.out.println(i);//i=5
if(++i == i){//从左到右,左边i的值先自增,然后把自增完的值入栈,右边把i(此时i已自增)的值入栈,栈中值进行比较,相同
System.out.println(99999);
}
System.out.println(i);//i=6
if(i == ++i){//从左到右,左边i的值先入栈,右边i的值先自增再入栈,栈中值进行比较,所以i值不相同
System.out.println(888888);
}
System.out.println(i);//i=7
System.out.println("-----------------");
System.out.println(i);//i=7
if(i++ == i){//从左到右,左边i的值先入栈,再自增,右边i的值(此时i已自增)入栈,栈中值进行比较,不相同
System.out.println(55555555);
}
System.out.println(i);//i=8
System.out.println(i);//8
if(i == i++){//从左到右,左边i的值入栈,右边i的值先入栈,再自增,栈中值进行比较,相同
System.out.println(11111111);
}
System.out.println(i);//9
}
下面我们从图示来说明上述代码示例
当执行i=1
的这个操作时,将i为1线压入栈中。此时i=1
当再次执行i=i++;
时,这里会将i=1
压入栈中,本地变量表中的i=2
,最后再从栈中取出1赋值给i,此时i=1
当执行 int a = i++ + ++i + i++ + ++i;
,从做到右,线看i++
,因为这里会将i=1
存放入栈中,子啊本地变量表里。进行加1的操作,此i=1
.(栈中的值)
当执行++i时,因为这里是后加,所以这里i=3
,将i=3
存放到栈中。这里i=3
.
接着i++
,i的值3先压入栈中,i再自增变为4;,这里i=3
.
里是后加,所以这里i=3
,将i=3
存放到栈中。这里i=3
.
接着i++
,i的值3先压入栈中,i再自增变为4;,这里i=3
.
接着++i
,i的值4会先自增为5,再将5压入栈中,这里i=5
.