• 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++ 然后保存到另一变量 然后赋值。
  • 相关阅读:
    Linux下的crontab定时执行任务命令详解
    TP5使用Composer安装PhpSpreadsheet类库实现导入导出
    在本地创建分支并发布到远程仓库
    Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法
    crontab 定时写法整理
    Linux && Windows下基于ThinkPHP5框架实现定时任务(TP5定时任务)-结合Crontab任务
    Echarts环形图、折线图通过ajax动态获取数据
    javascript另类方法高效实现htmlencode()与htmldecode()函数,附带PHP请求完整操作
    PHP获取本月开始、结束时间,近七天所有时间
    关于sql中case when用法
  • 原文地址:https://www.cnblogs.com/eggbucket/p/2511926.html
Copyright © 2020-2023  润新知