i++ 和 ++i 的区别 !!!

 

原创:https://blog.csdn.net/android_cai_niao/article/details/106027313

说明:原创很详细,这里仅记录自己理解后的笔记。

 

 

知识核心:

 i++ 即后加加,原理是:先自增,然后返回自增之前的值
 ++i 即前加加,原理是:先自增,然后返回自增后的值
重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增。

有很多的人写的文章上都是说i++是先返回i的值,然后再自增,这是错误,是先自增,然后再返回自增之前的值。
你可能会问,这有区别吗?答案:有的。只要这个没理解对,则你在计算i++的相关问题时就有可能算错。

 

 

计算关键:
表达式有一个原则:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的

举例理解:

在计算 (3*a++) + a 时,a 先自增,然后在 a++ 操作中返回 a 自增前的值,但实际上 a 的值经过 "i++" 这个 函数 操作后,值已经变为了 3.

所以,换句话来说, i++ 作用可用下面代码说明:
int temp = i;
i = i + 1;
return temp;  
 

 

 

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。

 

 

无用功代码分析:

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 的值最终还是和原来一样。

 

int a = 0;
int b = 0;
a = a++;
b = a++;
System.out.println("a = " + a + ", b = " + b); // a = 1, b = 0
a = a++; a++之后a的值为1,并返回0,此时a的值为1,但是接着0又赋值给了a,所以a的值变为了0
b = a++; 上一行代码执行之后 a的值还是0,再到这里的a++,a的值就变成了1,返回0,0赋值给b,所以b为0,而a还是1。

 

 

综合检测理解:

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

 

 

 

自己理解:

在单独的作为一个语句时, i++ 和  ++i  作用相同(i 的值都自增1)。
作用不同的时候,是在赋值的时候: a=i++;  和 a=++i; 一个是自增前的值,一个自增后的值。

 

 

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值