我所理解的i++和++i

 

我所理解的i++和++i

标签: i++++ijava基础表达式
  263人阅读  评论(0)  收藏  举报
  分类:
 

转载请说明出处,本文来自Android菜鸟:http://blog.youkuaiyun.com/android_cai_niao/article/details/42490473     QQ:2717521606


1、示例1

        int i = 0;

        for (int k = 0; k < 3; k++) {

                i = i++;

        }

        System.out.println("i = " + i); // 为什么结果输出是0

2、示例2

        int a = 2; 

        int b = (3 * a++) + a;

        System.out.println(b); // 为什么输出结果是9

3、示例3

        int a = 2; 

        int b = a + (3 * a++);

        System.out.println(b); // 为什么输出结果是8

4、示例4

        int i = 1;

        int j = 1;

        int k = i++ + ++i + ++j + j++;

        // k 等于几呢?

 

对于上面4个例题,看完下面的“i++ 和 ++i原理” 和 “表达式原则”即可很容易算出,当然,这些原则是我自称的原则-_-。sorry!

 

i++ 和 ++i原理

i++ 即后加加,原理是:先自增,然后返回自增之前的值

++i 即前加加,原理是:先自增,然后返回自增后的值

重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增。

对于++i 就不说了,大多数人都懂,而对于 i++ 原理,用代码分析表示如下:

int temp = i;

i = i + 1;

return temp;  

这3句代表就是上面所说的那样:i++是先自增,然后返回自增之前的值

 

好了,看到这就可以解决例题1的问题了:

int i = 0;

i = i++;  

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

表达式原则

表达式有一个原则:是表达式,就会有返回值。(即表达式计算后都会有返回值)

 

注:来看一下if语句的其中一种结构:

if (条件表达式) 语句;

 

用这个结构写个代码如下:

boolean b = true;

int i = 0;

if(b) i++;

可看到if中的表达式只有一个变量b,虽然只有一个b,但是它也是一个表达式。

所以记住:一个变量也是表达式。

有了这个原则,就可以解达剩下的3个例题了:

 

int a = 2; 

int b = (3 * a++) + a;

System.out.println(b); // 为什么输出结果是9

按着i++的原理不难理解这题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

 

可是换一下顺序下面的结果则为8:

 

int a = 2; 

int b = a + (3 * a++);

System.out.println(b); // 为什么输出结果是8

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

b = 9 这个结果是错误的,来看一面的表达式:

int b = (a * 1) + (3 * a++); // 其实我们知道这个表达式和“int b = a + (3 * a++);”是一样的。因为任何数乘以1的值都是自己本身。

看“int b = (a * 1) + (3 * a++)”这个的话,你会知道要先算(a* 1),然后表达式变成int b = (2 * 1) + (3 * a++),这个时候你就能算出正确答案了。

看“int b = a + (3 * a++)”这个的话,前面的a虽然没加括号,但它也是一个表达式,记得前面说过的原则吗?一个变量也是一个表达式,是表达式就会有返回值,所以要先算a这个表达式,可以这样理解int b = (a)+ (3 * a++),然后可变为:

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

int b = 2 + (3 * 2);所以结果为8。此时a的值为3 

所以请记住:1个变量它也是一个表达式:

int b = 3 + (3 * a++);

所以这里最前面的a是一个表达式,而(3 * a++)也是一个表达式,这两个表达式要进行相加,我们知道加法的优先级是从左到右,那就是说要先算a这个表达式,是表达式就会有返回值,返回值为a的值2,所以此时整个大的表达式为:int b = 2 + (3 * a++);

 

例题4解析:

int i = 1;

int j = 1;

int k = i++ + ++i + ++j + j++;

很明显都是加法,运算的优先级为从左到右。

我们知道了i++与++i的原理,并且知道了表达式一定会有返回值这些知识后,这道题就很容易解了:

1、看第一段表达式:i++

i++后i = 2,这是一个表达式,是表达式就会有一个返回值,这是后++所以返回自增之前的值,那么也就是返回1,此时整个大表达式如下:

int k = 1 + ++i + ++j + j++; // 此时i的值为2

可看到表达式中第1个表达式返回了1,但是此时i的值已经是2了。

2、看第二段表达式++i

上一步中知道i已经为2了,所以++i后,i = 3,表达式肯定有返回值,并且++i是返回自增后的值,所以表达式返回3,此时整个大表达式如下:

int k = 1 + 3 + ++j + j++; //此时i的值为3

3、看第三段表达式++j

自增后j = 2; 表达式中返回自增后的值2,如下:

int k = 1 + 3 + 2 + j++; // 此时j=2

4、看第四段表达式j++

上一步知道j = 2,所以j++后j = 3;后++返回的是自增之前的值2,此时整个大表达式如下:

int k = 1 + 3 + 2 + 2; // 此时j=3

最终k = 8;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值