zoukankan      html  css  js  c++  java
  • 弄懂Java的自增变量

    首先我们来看一段代码:

        public static void main(String[] args){
            int i = 1;
            i = i++;  //第一行
            int j = i++; //第二行
            int k = i + ++i * i++; //第三行
            System.out.println("i=" + i);
            System.out.println("j=" + j);
            System.out.println("k=" + k);
        }
    

    大家可以先不要看下面的答案,写出自己的答案。

    分析

    在进行讲解前,我们先讲解一些基本的概念来帮助我们下面的分析。

    概念

    首先我们要知道普通我们的语句是如何执行的。

    比如i = a + b * c,我们设i = 0a1b2c3

    在进行运行时,左边的i是保存在局部变量中,也就是保存在栈中;而右边的计算是在操作数栈中进行计算的。

    在进行右边操作数栈计算完毕后,会将结果赋值给左边对应的局部变量。

    第一步

    在进行i = i ++进行计算时,会将左边的放进局部变量,右边的i++放进操作数栈,然后进行计算。

    此时计算i++i++ 操作等于 i = i + 1,所以加1后赋值给局部变量,而操作数栈仍未1

    将操作数栈的1赋值给局部变量,所以这一步计算完之后结果仍未1

    第二步

    ​ 此时局部变量中i的值为1 ,现将i放进操作数栈,然后计算i++

    计算完i++之后,局部变量中的i2,操作数栈的结果为1

    然后将操作数栈中的值赋值给j

    第三步

    在进行计算之前,i的值为2j的值为1

    右边的三个数字分别要压入操作数栈,分别是i++ii++

    i直接放入是2++i要进行计算,计算后局部变量中的i3,因为是++i,所以放入的也是3i++先放入3,然后计算i++,此时局部变量表中i的值为4

    将前一步操作数栈的值计算完之后放入k中即可。

    总结

    • 赋值=,最后计算
    • =右边的从左到右加载值依次压入操作数栈
    • 实际先算哪个,看运算符优先级
    • 自增、自减操作都是直接修改变量的值,不经过操作数栈
    • 最后的赋值之前,临时结果也是存储在操作数栈中
  • 相关阅读:
    团队项目——需求规格说明书
    UML
    第二次团队作业——预则立&&他山之石
    团队选题报告
    团队展示
    ubuntu下使用pyinstaller将python文件打包成exe(py文件中含有keras框架的代码)
    ubuntu 为项目配置虚拟环境
    安装cuda9.0 + cudnn7.0 与 cuda8.0共存
    ubuntu 16.04 + cuda8.0 + cudnn 6.1 + tensorflow 1.4.0
    修改vs2013中MFC项目名称
  • 原文地址:https://www.cnblogs.com/ArvinYL/p/13060884.html
Copyright © 2011-2022 走看看