zoukankan      html  css  js  c++  java
  • 自增变量

        先来看看下面的代码:

    1. public class test {  
    2.     public static void main(String[] args) {  
    3.         int i = 1;  
    4.         i = i++;  
    5.         int j = i++;  
    6.         int k = i + ++i * i++;  
    7.         System.out.println(i);  
    8.         System.out.println(j);  
    9.         System.out.println(k);  
    10.     }  

    先来分析第4行:

        这是经典题目i=i++;,可以扯出Java的特性

        首先先算等号右边,i++,然后由于i++是先用后加,当然看似先用后加,其实虚拟机是先把这个操作数做一个备份,然后再原数上加,赋值时候把这个备份赋值出去,所以我们执行如下操作:

      

    1. 把i值压入操作数栈,因为运算过程是要在操作数栈中进行

    2. i变量自增,局部变量表中的i变成2

    3. 我们刚刚算的是整个右边的结果2,然后把备份赋值出去

      因此i=i++;这句话结果是i没有自增。

    接下来分析第5行:

        这时候还备份时,还给的是j所以i自增的值被保留下来了

     

    接下来看第6行:

    1. 把i的值压入操作数栈
    2. 后面一个++i,i变量自增1,变成3
    3. 执行完后的得数都会被压入操作数栈【局部量表:3 操作数栈:3/2】
    4. i++ 把i的值压入操作数栈【局部量表:3 操作数栈:3/3/2】
    5. i变量自增 【局部量表:4 操作数栈:3/3/2】
    6. 把操作数栈中前两个弹出求乘积结果再压入栈【局部量表:4 操作数栈:9/2】
    7. 把操作数中的值弹出求和赋值求和给k【局部量表:4 操作数栈:空】

    大家可以仿造我们初学栈时老师给的表达式求值的算法题,来模拟上述过程。

  • 相关阅读:
    GCC-windows的预编译版本——nuwen MinGW
    stm32 flash和sram
    NAND Flash和NOR Flash的比较
    emwin如何在windows10下vs2015或2017进行仿真。
    IIC简介(转载)
    ubuntu版本查看
    下载速度更加快的 SourceForge 镜像
    使用virtualbox安装的Ubuntu,窗口分辨率过小,使用增强工具完成和vmtools一样的功能。
    C#中的结构体与类的区别
    理解C#值类型和引用类型
  • 原文地址:https://www.cnblogs.com/figsprite/p/10775838.html
Copyright © 2011-2022 走看看