JavaSE面试题:自增变量

来源:https://runwsh.com/

  • 代码
    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);
}
  • 现在,让我们逐行解释这段代码的执行

1. int i = 1;:创建整数变量 i 并将其初始化为1。(i=1;)

2. i = i++;:这是一个有争议的表达式。首先,它将 i 的当前值1压栈到一个操作数栈中。然后,它将 i 自增1,这就使得变量i=2了,但右边的操作数栈不是没有后续的逻辑运算了,就会将之前压到操作数栈的1赋值给i。所以,i 的值又变为了1。(i=1;)

  • 如果是`i=++i`呢,就是入栈的时候就会将自增后的变量i压入栈中,变量i2,使得出栈的时候也是为2了。

3. int j = i++;:将 i 的当前值1赋给 j,然后将 i 自增1。所以,j 的值是1,而 i 的值变为2。(i=2;j=1)

4. int k = i + ++i * i++;:这是一个复杂的表达式。首先看右边的表达式,操作数栈会先将i变量入栈;也就是2先入栈,这个时候往右走++i,是将i自增后的数压入栈中,也就是3,然后再看下一个操作数是i++;记住一点的就是,++i压入栈中是将i自增后压入栈中;i++是将i变量压入栈中; ,记住这个规则就是,继续压入栈中的数字是3 。所以现在的操作数栈中的数据从栈低到栈顶依次为:2->3->3;按照运算符操作顺序先乘后加,2+3*3=11。

打印结果:

i=4
j=1
k=11

小结

    1. 赋值=,最后计算
    1. =右边的从左到右加载值依次压入操作数栈
    1. 实际先算哪个,看运算符优先级
    1. 自增、自减操作都是直接修改变量的值,不经过操作数栈
    1. 最后的赋值之前,临时结果也是存储在操作数栈中

建议:《JVM虚拟机规范》关于指令的部分

JavaSE面试题01:自增变量的更多相关文章

  1. 01_javaSE面试题:自增变量

    开启刷面试题,都是根据视频进行刷面试题的 自增变量,只要记住两点 i++ 是先赋值后计算 ++i 是先计算后赋值 看下面的代码 int i = 1; i = i++; int j = i++; int ...

  2. JavaSE 笔试题: 自增变量

    JavaSE 笔试题 自增变量 public class Test { public static void main(String[] args) { int i = 1; i = i++; int ...

  3. JavaSE 面试题: 成员变量与局部变量

    JavaSE 面试题 成员变量与局部变量 public class Test { static int s; int i; int j; { int i = 1; i++; j++; s++; } p ...

  4. JavaSE面试题

    JavaSE面试题 欢迎到我的Git仓库去提交您觉得优秀的内容! 1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.当一个static方法被调用时,可能还没有创建任何实例 ...

  5. Java设计模式面试题 01 - 六大原则

    Java设计模式面试题 01 - 六大原则 1. 单一职责原则 Single Responsibility Principle SRP原则 分清职责,接口一定要做到单一职责,方法也要做到,类尽量做到 ...

  6. 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步

    假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...

  7. 【012】JavaSE面试题(十二):多线程(2)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [012] - JavaSE面试题(十二):多线程(2) 第1问:多线程的创建方式? 方式一:继承 ...

  8. 【011】JavaSE面试题(十一):多线程(1)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [011] - JavaSE面试题(十一):多线程(1) 第1问:线程和进程的区别? 进程:具有一 ...

  9. [010] - JavaSE面试题(十):集合之Map

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [010] - JavaSE面试题(十):集合之Map 第1问:HashMap和HashTable ...

  10. [006] - JavaSE面试题(六):泛型

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [006] - JavaSE面试题(六):泛型 第1问:什么是泛型? Java泛型( generi ...

随机推荐

  1. redis 中的 set

    set是String中的无序集合  底层是 是 value为null 的hash表  时间复杂化是o(1): sadd  k1 v1 v2 v3  set中添加数据 smembers k1 取出set ...

  2. Module build failed: TypeError: this.getOptions is not a function at Object.loader

    这个问题主要是因为node-loader版本过高导致的问题 解决方案 css-loader降为3.6.0版本即可 npm install css-loader@2.0.2 --save-dev npm ...

  3. Windows 下搭建 Appium + Android+python 自动化测试环境

    前言 本来并不打算写这么一篇文章,但是实践下来发现网上的各种教程里大致有两个问题.一是文章有些跟不上时代,目前android开发和测试的技术更新都比较快,内容有些过期.二是细节部分不是太完整,拼拼凑凑 ...

  4. 记通过mysql数据库成功入侵到服务器内部的渗透实战

    1,在成功进入mysql到数据库之后,可以使用select user();命令,查看当前的用户,如果为root,则可以执行下一步操作.不为root,则需要通过其他方法提权. 2, 使用show var ...

  5. Java安全之Webshell免杀

    Java安全之Webshell免杀 当遇到文件上传时,如果网站存在查杀软件,我们上传的一句话木马会被直接秒杀,这时候就需要做一下免杀,绕过查杀软件的检测. 思路 我的想法是先拆分,然后分别检验那些语句 ...

  6. JOIN 关联表中 ON、WHERE 后面跟条件的区别

    SQL中join连接查询时条件放在on后与where后的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和wh ...

  7. 国内镜像安装Python解释器及扩展包

    一.下载Python解释器 1.下载地址 官网(下载速度很慢):Welcome to Python.org 淘宝镜像(推荐):CNPM Binaries Mirror (npmmirror.com) ...

  8. 快速理解DDD领域驱动设计架构思想-基础篇

    1 前言 本文与大家一起学习并介绍领域驱动设计(Domain Drive Design) 简称DDD,以及为什么我们需要领域驱动设计,它有哪些优缺点,尽量用一些通俗易懂文字来描述讲解领域驱动设计,本篇 ...

  9. 基于 Wiki.js 搭建知识库系统

    前言 本文介绍如何使用 Wiki.js 搭建知识库系统. Wiki.js 官网 安装 前提准备 Wiki.js 几乎可以在任何支持 Node.js 的系统上运行.它可以运行在 Linux .Windo ...

  10. Record - Dec. 2st, 2020 - Exam. REC

    Prob. 1 Desc. & Link. 有一个基础想法,即一次操作三可以用一次操作一加上一次操作二来实现,然后他又没让我们最小化操作次数,所以我们令 \(M=\min\{A+R,M\}\) ...