首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 系统运维 >

int i=零; i=i++ System.out.Println(i)

2012-12-20 
int i0 ii++ System.out.Println(i)?public?class?Test?{ ??????public?static?void?main(String[]?arg

int i=0; i=i++ System.out.Println(i)

?


  1. public
    ?class?Test?{ ??
  2. ????public?static?void?main(String[]?args)?{ ??
  3. ????????int?i=0; ??
  4. ????????i=i++; ??
  5. ????????System.out.println(i); ??
  6. ????} ??
  7. } ?
  8. 结果是0
  9. 为什么是0 因为:
  10. 是因为Java编译器的原因:我们来看看编译后的字节码
  1. 0  iconst_0 //将int型0推送至栈顶?
    1  istore_1 //将栈顶int型数值存入第二个本地变量 i=0 ??(int i=0)
    2  iload_1 //将第二个int型本地变量推送至栈顶 ? ? ? ? ? 然后将i推送至栈顶 ? 0
    3  iinc 1 1 //将指定int型变量增加指定值(i++, i--, i+=2)完成i++
    4  istore_1 //将栈顶int型数值存入第二个本地变量 ? ? ? ?将栈元素赋值给了i ? ?i=0
    5  getstatic java/lang/System/out Ljava/io/PrintStream;
    6  iload_1

    1. ?public?static?void?main(String[]?args)?{ ??
    2. ????????int?i=0; ??
    3. ? ? ? ??i++; ??
    4. ????????System.out.println(i); ??
    5. ????} ?
    6. 字节码为:
    7. iconst_0 //将int型0推送至栈顶?
    8. istore_1 //将栈顶int型数值存入第二个本地变量 i=0 ??(int i=0)
    9. iinc 1 1 //将指定int型变量增加指定值(i++, i--, i+=2)完成i++
      1. public?static?void?main(String[]?args)?{ ??
      2. ????????int?i=0; ??
      3. ? ? ? ? int k=i++; ??
      4. ????????System.out.println(i); ??
      5. ????} ?
      6. 字节码为:
      7. 0  iconst_0 //将int型0推送至栈顶?
        1  istore_1 //将栈顶int型数值存入第二个本地变量 i=0 ??(int i=0)
        2  iload_1 //将第二个int型本地变量推送至栈顶 ? ? ? ? ? 然后将i推送至栈顶 ? 0
        3  iinc 1 1 //将指定int型变量增加指定值(i++, i--, i+=2)完成i++
        4  istore_2 //将栈顶int型数值存入第三个本地变量 ? ? ? ?将栈元素赋值给了i ? ?i=0
        5  getstatic java/lang/System/out Ljava/io/PrintStream;
        6  iload_1
        1. public?static?void?main(String[]?args)?{ ??
        2. ????????int?i=0; ??
        3. ? ? ? ? int k=++i; ??
        4. ????????System.out.println(i); ??
        5. ????} ?
        6. 字节码为:
        7. 0 iconst_0
          1 istore_1
          2 iinc 1 by 1
          5 iload_1
          6 istore_2

  2. 对比而言,对于i++而言,i=i++指令多了两步,2和4
    其实这两步是赋值符号引起的,有意思的是第二步出现的时机,是在iinc之前,这就是因为java lang spec中规定的。
  3. java编译器对于++i 并不会生成2和4
  4. int i=0 i=i++ 或者 int i=0 int j= i++ ? ? ?相当于 int temp = i ? ?i++ ? i=temp ? ???int temp = i ? ?i++ ? j=temp
  5. int i=0 i=++i ? 相当于 ++i ?temp = i ?i=temp;
  6. 总结:java编译器对于i++会先将i的值保存至另一变量 然后在对i++,另一变量仍没有改变。 而对于++i 是先对i++ 然后保存到另一变量 然后赋值。

热点排行