Java_基础_i=i++;

例:

package deep;

public class PostfixIncrementOperator {
    public static void main(String[] args) {
        int i = 10;
        i = i++;
        System.out.println(i);
    }
}

运行结果:10

首先我们看JLS中对后置加的解释:The result of the postfix increment expression is not a variable, but a value. 即后置加的结果不是一个变量,而是一个值。并且后置加的优先级在赋值之前,所以是先完成的后置加再进行的赋值。

我们先使用javac -g PostfixIncrementOperator.java编译源码,再使用javap -c -s -l -v PostfixIncrementOperator.class反汇编此class.。如下:

Classfile /C:/Users/tspoi/workspace/Test/src/deep/PostfixIncrementOperator.class

  Last modified 2015-8-7; size 584 bytes
  MD5 checksum 69c9ee93f1dbe68468d009ddf8f0a1b1
  Compiled from "PostfixIncrementOperator.java"
public class deep.PostfixIncrementOperator
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#21         // java/lang/Object."<init>":()V
   #2 = Fieldref           #22.#23        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = Methodref          #24.#25        // java/io/PrintStream.println:(I)V
   #4 = Class              #26            // deep/PostfixIncrementOperator
   #5 = Class              #27            // java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               LocalVariableTable
  #11 = Utf8               this
  #12 = Utf8               Ldeep/PostfixIncrementOperator;
  #13 = Utf8               main
  #14 = Utf8               ([Ljava/lang/String;)V
  #15 = Utf8               args
  #16 = Utf8               [Ljava/lang/String;
  #17 = Utf8               i
  #18 = Utf8               I
  #19 = Utf8               SourceFile
  #20 = Utf8               PostfixIncrementOperator.java
  #21 = NameAndType        #6:#7          // "<init>":()V
  #22 = Class              #28            // java/lang/System
  #23 = NameAndType        #29:#30        // out:Ljava/io/PrintStream;
  #24 = Class              #31            // java/io/PrintStream
  #25 = NameAndType        #32:#33        // println:(I)V
  #26 = Utf8               deep/PostfixIncrementOperator
  #27 = Utf8               java/lang/Object
  #28 = Utf8               java/lang/System
  #29 = Utf8               out
  #30 = Utf8               Ljava/io/PrintStream;
  #31 = Utf8               java/io/PrintStream
  #32 = Utf8               println
  #33 = Utf8               (I)V
{
  public deep.PostfixIncrementOperator();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Ldeep/PostfixIncrementOperator;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: bipush        10
         2: istore_1
         3: iload_1
         4: iinc          1, 1
         7: istore_1
         8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        11: iload_1
        12: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        15: return
      LineNumberTable:
        line 5: 0
        line 6: 3
        line 7: 8
        line 8: 15
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      16     0  args   [Ljava/lang/String;
            3      13     1     i   I
}

我们主要看关键部分:

         0: bipush        10    //常数10入栈
         2: istore_1            //常数值出栈,i入栈
                                //至此完成i=10;
         3: iload_1             //装载变量i,10入栈
                                //这是特殊的一步,这步将i值先行保存,以备赋值使用
         4: iinc          1, 1  //变量值增加,栈内值不变
         7: istore_1            //i赋值,还是赋的10,因为栈内值未改变

So…

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 01:14:43

Java_基础_i=i++;的相关文章

java_基础——在代码里编译.java文件

[本文介绍] 本文不是深入理解和使用java编译器,只是在代码里编译.java文件的helloWorld.这种技术还是蛮有意思的,说不定在将来的某些只能化项目会运用到!^_^ [编译最基础的流程] [java代码] 1 package com.zjm.www.test; 2 3 import java.io.IOException; 4 5 import javax.tools.JavaCompiler; 6 import javax.tools.JavaCompiler.Compilation

java_基础总结

1,常用的原始数据类型 int 整数 float,double 浮点数,double 相对float 范围更宽 boolean 布尔值 EX:(1+14)/2 用int 来表示,就只会得到整数部分,不会得到小数部分 用float,double来表示,要加f或d才会得到小数部分 int a=(1+14)/2; float b=(1+14)/2f; double c=(1+14)/2d; 布尔值是判断true 或者 false 的数据类型,其中会用到一些逻辑运算符,如 &&,||,前者表示AN

java_基础_异常

之前只是了解的最基础的异常形式,没有过多的深入 今天因为一些原因了解了一下 下面来说说异常的几种形式 1.try-catch语句块 代码示例 class test{ public static void main(String[] args) { try { int a = 1/0; System.out.println(a); }catch(ArithmeticException e) { e.printStackTrace(); System.out.println(e); }finally

JAVA_基础数据类型包装类

Java_基础知识回顾

1.ByteArrayInputStream. ByteArrayOutputStream String str = "ZHANGSAN"; //System.out.println(str.toLowerCase()); ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes()); ByteArrayOutputStream outputStream = new ByteArrayOutput

Java_基础语法编程练习

一:让计算机随机产生100个0到100之间的整数,每个整数代表某个学生的成绩,计算这些成绩的平均值 public static void main(String[] args) { int sum = 0; for(int i = 0 ;i < 100 ;i++) { int n = (int) (Math.random()*101); sum += n; } System.out.println("平均值为:" + (sum/100.0)); } 二: 输入一个100-999的

【java_基础】JVM内存模型和垃圾回收机制

1. JVM内存模型 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. 先来看一下Java程序具体执行的过程 上图中的运行数据区(Runtime Data Areas)即为JVM内存区域,其结构如下图: 各区域存储的具体信息: 1.1 程序计数器 程序计数器(Program Counter Register),也有称作为PC寄存器.JVM中的程序计数器跟汇编语言中的程序计数器在功能上是相同的,即指示待执行指令的地址.当 CPU

【Java_基础】java中static与final关键字的区别

1.static关键字 经由static关键字修饰的成员为类成员,被所有对象所共享,通常通过类名来引用static成员.类加载的连接阶段将会为静态成员变量在jvm内存的方法区分配空间,并在类的初始化阶段赋初值. 一个类的static成员变量只有“一份”(存储在方法区),无论该类创建了多少对象.看如下的示例: public class StaticDemo { public static void main(String[] args) { People p1 = new People(18);

Java_基础篇(杨辉三角)

对于刚刚学Java的同学来说,杨辉三角是一个很好的例子. 杨辉三角让初学者更好的理解数组的定义和更好地去运用数组,特别是二维数组. 除此之外,还让初学者更好的掌握嵌套语句的使用. 以下是我的杨辉三角Java代码: 1 /* 2 * 简单的杨辉三角 3 * 1 4 * 1 1 5 * 1 2 1 6 * 1 3 3 1 7 * 1 4 6 4 1 8 * ... 9 * 根据杨辉三角的规律: 10 * 1.每一行增加一个数. 11 * 2.每一行的第一个数和最后一个数都是1. 12 * 3.从第三