zoukankan      html  css  js  c++  java
  • 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++ 然后保存到另一变量 然后赋值。
  • 相关阅读:
    CodeDeploy 应用程序规范文件
    Lambda 函数的最佳实践
    路由策略
    AWS CodeStar
    使用 Lambda@Edge 在边缘站点自定义内容
    Step Functions
    将应用程序部署到 AWS Elastic Beanstalk 环境
    DynamoDB 静态加密
    web数据安全——防篡改
    【Spring】spring全局异常处理即全局model数据写入
  • 原文地址:https://www.cnblogs.com/eggbucket/p/2511926.html
Copyright © 2011-2022 走看看