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 操作数栈:空】

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

  • 相关阅读:
    Forms身份验证和基于Role的权限验证
    构建高扩展性网站
    多态和继承(继承)
    MVC使用Bootstrap
    使用Navicat Premium 和PLSQL Developer连接Oracl
    内存排查 valgrind
    MVC Bootstrap Helpers
    IOS各种调试
    JavaScript 奇技淫巧
    深入理解Linux修改hostname(转)
  • 原文地址:https://www.cnblogs.com/figsprite/p/10775838.html
Copyright © 2011-2022 走看看