`
m635674608
  • 浏览: 5028678 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

i++

 
阅读更多
public class Test {

    public static void main(String... args) {

         int i = 0;

         i = i++;

        System.out.println(i);

    }

}



使用javac编译后再使用javap -c Test反编译这个类查看它的字节码,如下(只摘取main方法):



public static void main(java.lang.String[]);

  Code:

   0:   iconst_0

   1:   istore_1

   2:   iload_1

   3:   iinc    1, 1

   6:   istore_1

   7:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;

   10:  iload_1

   11:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V

   14:  return

   

这里,我从第0行开始分析(分析中【】表示栈,栈的底端在左边,顶端在右边):

0:将常数0压入栈,栈内容:【0】

1:将栈顶的元素弹出,也就是0,保存到局部变量区索引为为1(也就是变量i)的地方。栈内容:【】

2:将局部变量区索引为1(也就是变量i)的值压入栈,栈内容:【0】

3:将局部变量区索引为1(也就是常量i)的值加一,此时局部变量区索引为1的值(也就是i的值)是1。栈内容:【0】

6:将栈顶元素弹出,保存到局部变量区索引为1(也就是i)的地方,此时i又变成了0。栈内容:【】

7:获取常量池中索引为2所表示的类变量,也就是System.out。栈元素:【】

10:将局部变量区索引为1的值(也就是i)压入栈。栈元素:【0】

11:调用常量池索引为3的方法,也就是System.out.println

14:返回main方法 

 

分享到:
评论

相关推荐

    谈谈Java中的i++

    这是和JVM的内存分配有关,JVM在处理这段带代码时,会先把i++的结果赋值给一个临时变量temp,然后再将这个临时变量的值赋值给i。即如下: int i = 0; int temp; // i = i++; int a = temp = i++;// 临时变量...

    I++ DME2.0

    ### I++ DME2.0:尺寸测量标准与接口协议详解 #### 一、引言 I++ DME2.0(Dimensional Measurement Equipment Interface)是三坐标测量领域中的一个重要标准,它定义了一套用于尺寸测量设备之间的通信协议。本标准...

    浅谈c i++与java i++的区别

    浅谈c i++与java i++的区别 在编程语言中,increment运算符(++)是一个非常常用的操作符,它可以将变量的值增加1。但是,c语言和java语言在使用increment运算符时存在着一些区别,这篇文章将深入探讨c语言和java...

    java中for(int i= 0; i<=10;i=i++)System.out.print(i);为什么无限输出0

    当它作为后缀(如`i++`)出现在表达式中时,首先返回变量的当前值,然后将变量的值增加1。这种行为可以理解为下面两个步骤: 1. **获取当前值**:首先获取变量`i`的当前值。 2. **增加变量值**:然后将变量`i`的值...

    I++ DME1.7

    ### I++ DME1.7:尺寸测量标准与接口协议详解 #### 一、I++ DME概述 I++ DME (Dimensional Measurement Equipment Interface) 是一个专为三坐标测量机(CMM)和其他尺寸测量设备设计的标准接口协议。该协议旨在提供...

    i = i++ 代码分析

    i = i++ 代码分析 在 Java 中,i = i++ 代码的执行结果可能会让人感到意外。下面我们将对这段代码进行详细的分析。 首先,让我们看一下这段代码: ```java int i = 0; i = i++; System.out.println(i); ``` 乍看之...

    I++ DME Specification Document

    这是一本关于I++DME规范的详细介绍,里面定义了对象模型、类、操作方法等

    关于i++和++i以及左值,右值

    在实际编程中,i++和++i的效率差异往往被忽略,因为对于内置类型,在大多数编译器中,i++和++i的效率是相同的,编译器会进行优化。然而,对于自定义类型,尤其是当重载了前缀和后缀的自增运算符时,使用++i通常更为...

    java中对 i=i++ 的 解释(反编译出java虚拟机指令的)

    在Java编程语言中,`i=i++`是一个典型的自增表达式,它的行为可能会引起一些混淆,特别是当对比于其他编程语言如C或C++时。这个表达式在Java中的行为可以通过反编译成Java虚拟机(JVM)指令来理解。 首先,让我们...

    C# i++and++i

    在C#编程语言中,`i++` 和 `++i` 是两种常见的增量运算符,它们都用于将变量的值增加1。然而,虽然这两者看似相似,但在语义上存在细微差别,尤其是在某些特定上下文中。理解这些差异对于编写高效、清晰的代码至关...

    ++i,i++,--i,i--终结

    ### 关于“++i, i++, --i, i--”的理解与应用 #### 一、基本概念 在C/C++编程语言中,“++i, i++, --i, i--”是一组非常重要的自增自减运算符。这些运算符主要用于在程序中修改变量的值。了解这些运算符的工作原理...

    测试i++和++i的区别

    使用++i和i++可以使迭代操作变得容易,但是两者到底区别在哪可以从这个程序中得知,使用java语言编写

    为什么(i++)不能做左值,而(++i)可以

    在C/C++中,后缀递增运算符(i++)和前缀递增运算符(++i)都用于将变量增加1,但它们的操作和结果在某些情况下有本质的区别。前缀递增运算符++i先增加变量的值,然后返回新的值。后缀递增运算符i++先返回变量当前的值,...

    while(i++and++i)_helloworld_

    在编程语言中,如C++或Java,"i++"和"++i"都是自增操作符,它们用于增加变量的值。这两个操作符的主要区别在于它们如何处理变量的值和何时更新这个值。 首先,让我们理解"i++"。这个操作符被称为后缀自增。当你在...

    快速区分一元运算符i++和++i.docx

    在JavaScript编程语言中,一元运算符`i++`和`++i`是常见的自增操作,它们在处理变量的值时有不同的行为和顺序。理解这两种运算符的区别对于编写高效和无误的代码至关重要。 首先,`i++`称为后置自增运算符。它的...

    c++的左值右值 i++与++i的区别.docx

    System.out.println((i++) + (i++) + (i++) + (++i) + (i++) + (++i)); 这里的计算步骤是: 1. i++ 返回 1,然后 i 变为 2 2. i++ 返回 2,然后 i 变为 3 3. i++ 返回 3,然后 i 变为 4 4. ++i 将 i 变为 5,然后...

    i ++ && ++ i

    在Java编程语言中,`i++` 和 `++i` 是两种不同的自增操作符,它们在表达式中的行为和优先级是理解此问题的关键。`i++` 是后置自增运算符,它首先使用变量`i`的当前值,然后将其加1;而`++i` 是前置自增运算符,它先...

    C语言中++i与i++的区别.docx

    在C语言中,`++i` 和 `i++` 是两种常见的自增操作符,它们在编程中的作用是增加变量的值。虽然它们看似相似,但在某些特定情况下,两者的行为是有区别的,这也是C语言初学者经常感到困惑的地方。本文将深入探讨这两...

    yang-mall-++i和i++

    ii ++i和i++ ++i和i++ ++i和i++ ++i和i++ ++i和i++

    浅析PHP中的i++与++i的区分及效率_.docx

    i++ 运算符 i++ 运算符是后缀递增运算符,它的执行顺序如下: 1. 返回当前变量的值 2. 将变量的值加 1 例如,以下代码: ```php $i = 5; echo $i++; // 输出 5 echo $i; // 输出 6 ``` ++i 运算符 ++i 运算符...

Global site tag (gtag.js) - Google Analytics