i++和++i的区别 (例题精讲)

i++的通俗的解释即是先赋值再自增,其实这里赋值的值是从操作数栈取的值,也就是说先将i的值压入栈中,

而自增是局部变量表的值自增。

而++i则相反,是先自增后赋值,就是局部变量表的自增,然后把局部变量表的值压入栈中。

接下来可以通过以下五道例题理解消化:转载于:一看就懂得i++和++i详解

示例1 

int i = 0;
i = i++; 
System.out.println("i = " + i); 

示例2 

int a = 2; 
int b = (3 * a++) + a;
System.out.println(b);

示例3 

int a = 2;
 int b = a + (3 * a++);
System.out.println(b);

示例4 

int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++; 
System.out.println(k);

示例5 

扫描二维码关注公众号,回复: 13076832 查看本文章
int a = 0;
int b = 0;
a = a++;
b = a++;
System.out.println("a = " + a + ", b = " + b);

示例答案

示例1:0
示例2:9
示例3:8
示例4:8
示例5:a = 1, b = 0

 
 

示例1详解 

int i = 0;
i = i++; 
System.out.println("i = " + i);  // 结果:0

先看i++,根据原理“先自增,然后返回自增之前的值”,i 自增后,i = 1,但是接着返回自增之前的值0,此时表达式变成 i = 0,0没有赋值给 i 时 i 的值是1,但是当把0赋值给 i 时,i 的值就又变成0了。因此 i = i++ 这句代码是做无用功,因为 i 的值最终还是和原来一样。 
 

示例2详解 

int a = 2;
 int b = (3 * a++) + a;
System.out.println(b);   // 结果:9

int b = (3 * a++) + a;a++后,a = 3,并返回自增之前的值2,所以此时表达式为: 
int b = (3 * 2) + a;此时a的值已经是3了,表达式又变为: 
int b = (3 * 2) + 3; 所以b = 9 
 

示例3详解 

int a = 2; 
int b = a + (3 * a++);
System.out.println(b); // 结果:8

这题和示例2几乎一样啊,只是换了一下顺序而已,为什么结果就不一样了呢?这就需要用到“表达式原则 了”:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的 
int b = a + (3 * a++);按一般人的想法是先算 3 * a++,a 先自增 a=3,然后返回自增之前的值2,所以此时表达式变为: 
int b = a + (3 * 2); 此时a的值为3了,表达式又变为: 
int b = 3 + (3 * 2);结果 b = 9 
我们说一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,这个理论你可能不能深刻体会,但是如果我把代码稍微改一下你就能理解了,如下: 
int b = (a * 1) + (3 * a++) 这个代码和 int b = a + (3 * a++) 是一样的,没有区别,但是看(a *1)你就很容易的知道要先算a * 1这个表达式,表达式的结果为2。 
所以,虽然 int b = a + (3 * a++) 中前面的a只是一个变量,但他也是一个表达式,a这个表达式和(3 * a++)这个表达式进行相加,多个表达式的运算都是从左到右进行的,所以先算a这个表达式,a表达式计算结果为2,所以表达式变成: 
int b = 2 + (3 * a++) 然后是a自增并返回自增之前的值2,所以表达式又变为: 
int b = 2 + (3 * 2);所以结果为8。此时a的值为3 
 

示例4详解 

int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++; 
System.out.println(k);  // 结果:8

有了前面3条示例的详解,相信这一条大家就能自己解答了,可以先自己解答一下,看结果是不是8,不是的话,再来看我下面的讲解: 
表达式原则说多个表达式的加减法运算都是从左到右进行的,这里的表达式有:i++、++i、++j、j++,都是加法,那我们就从左到右计算这4个表达式就OK了,如下: 
1、先算i++,i++之后i的值为2,并返回++之前的值1,所以整个表达式可以变为: 
1 + ++i + ++j + j++; // 此时的i值为2 
2、再计算++i,++i之后i的值为3,并返回3,所以整个表达式可以变为: 
1 + 3 + ++j + j++; // 此时i的值为3 
3、再计算++j,++j之后j的值为2,并返回2,所以整个表达式可以变为: 
1 + 3 + 2 + j++; // 此时j的值为2 
4、再计算j++,j++之后 j的值为3,并返回2,所以整个表达式可以变为: 
1 + 3 + 2 +2; // 结果为8,此时j的值为3 
 

示例5详解 

int a = 0;
int b = 0;
a = a++;
b = a++;
System.out.println("a = " + a + ", b = " + b); // a = 1, b = 0

到了第5题,好像已经没有难度了,大家应该都能解出来了,但是为了文章的完整性,我还是分解一下,大家应该自己先算一次,算不对再来看我的分解: 
a = a++; a++之后a的值为1,并返回0,所以a的值由1又变回了0 b = a++; a++之后a的值为1,并返回0,0赋值给b,所以b为0,而a还是1哦!!
 

猜你喜欢

转载自blog.csdn.net/qq_44624536/article/details/115125198
今日推荐