
版权声明:本文为博主原创文章,未经博主允许不得转载。
转载请说明出处,本文来自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++ 原理,用代码分析表示如下:
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;