详细分别 i++; ++i; i = i +1; i += 1;
int a = 0; for (int i = 0; i < 99; i++) { a = a++; System.out.println("a :" + a); } int b = 0; for (int i = 0; i < 99; i++) { b = ++b; System.out.println("b :" + b); } int c = 0; for (int i = 0; i < 99; i++) { c = c + 1; System.out.println("c :" + c); } int d = 0; for (int i = 0; i < 99; i++) { d += 1; System.out.println("d :" + d); }
a的值为0 b c d的值为98
a = a++; 先赋值再加1
b = ++b; 先加1再赋值
c = c + 1; 先加1再赋值
d += d; 先加1再赋值
在同是int情况下 b c d 三种情况计算数值相同
把a b c d 的类型改为short类型:
short a = 0; for (int i = 0; i < 99; i++) { a = a++; System.out.println("a :" + a); } short b = 0; for (int i = 0; i < 99; i++) { b = ++b; System.out.println("b :" + b); } short c = 0; for (int i = 0; i < 99; i++) { c = c + 1; System.out.println("c :" + c); } short d = 0; for (int i = 0; i < 99; i++) { d += 1; System.out.println("d :" + d); }
结果为:a b d 可以执行,c编译报错, 原因是 short + int类型 返回给short类型,没有进行手动强制转换。 b d结果相同。 则证明 ++b 和 d += 1 结果相同。
使用jd-gui.exe文件,查看编译后的Class文件分析原因
int a = 0; for (int i = 0; i < 99; i++) { a = (short) (a + 1); a = a; System.out.println("a :" + a); } int b = 0; for (int i = 0; i < 99; i++) { b = (short) (b + 1); b = b; System.out.println("b :" + b); } int c = 0; for (int i = 0; i < 99; i++) { System.out.println("c :" + c); } int d = 0; for (int i = 0; i < 99; i++) { d = (short) (d + 1); System.out.println("d :" + d); }
结论1:a b d未报错的原因,是由于内部进行了强制转换,而 short c = 0; c = c + 1; 则需要手动强制转换。
结论2:使用 jd-gui.exe 编译后 出现2个问题 short类型变为int,a++ 和 ++b 编译后的结果相同,a++方式编译错误。
探讨小结:
1、在i++与++i 不与=同时使用时,得到的结果基本一致。当与=相同使用时,则会得到不同的结果。
2、(探讨问题)与=同时使用时,有人说 i++是先赋值后计算,++i是先计算后赋值。也有人说不论 i++还是++i,都是先计算,后赋值,i++返回自增前的值,++i返回自增后的值。
我觉得都没问题。先赋值后计算,还是先计算后赋值,只是对应的变量不同。
int a = 0; a = a++;
翻译源码:
{ int temp = a; a = a + 1; return temp; }
对于a变量来说,它是先计算后赋值,对于temp变量来说,则是先赋值,后计算。
int a = 0; a = ++a;
翻译源码:
{ a = a + 1; return a; }
++a 先计算后赋值没有争议。