详细分别 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 先计算后赋值没有争议。
posted @ 2019-08-09 13:29  bobwuming  阅读(383)  评论(0编辑  收藏  举报