终于弄明白 i = i++和 i = ++i 了


作者:默辨

来源:https://urlify.cn/Abyuyy


写在前面:前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛…

直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。

为此,我也专门写一篇博客,记录我的学习!!!

1、题目

package pers.mobian.questions01;


public class test01 {
    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);
    }
}

你能肯定并且准确的说出你的答案吗?

2、分析

在做这道题时我们的脑中要有对应的JVM内存结构。其中一个方法对应一个栈帧

此题目我们只需要用到栈帧里面的局部变量表和操作数栈

2.1、第一步

int i = 1

只是一个简单的赋值操作


2.2、第二步

i = i++

结果:i还是等于1

2.3、第三步

int j = i++

结果:i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1


2.4、第四步

int k = i + ++i * i++

结果:局部变量表中的i = 4,k = 11

2.5、结果

3、i = ++i

按理说根据上面的分析过程,再来分析 i = ++i,就很简单了。
我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i 。

public class test02 {
    public static void main(String[] args) {
        int i = 1;
        i = ++i;
        System.out.println(i); // 结果:i = 2
    }
}

最后的最后:本文的思考过程和计算推导仅针对Java语言


好文章,我在看

程序员闪充宝
关注 关注
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java面试 笔试题之i++问题
KooKing_L的博客
03-06 2041
注:以下代码除特殊说明外,均使用Java语言编写,编译器为eclipse,jdk版本为1.8 1.下面程序的输出结果是() public void test1() { int j=0; for(int i=0;i<100;i++) { j=j++; } System.out.println("j="+...
【Java基础】i = i + 1,i += 1, i++, ++i 的区别
Code_Yilia的博客
07-26 913
问题引入: 最开始是因为看到了一个题: ① short s1 = 1; s1 = s1 + 1; ② short s1 = 1; s1 += 1; 上面两条是否都可以成功编译? 答:① 中,由于 1 是 int 类型的,因此 s1 + 1 也是 int 类型的,需要进行强制类型转换,才能赋值给 short; ② 中,s1 += 1 就相当于 s1 = ((short)s1 + 1),+= 本身就隐含着强制类型转换,故可正确编译。 问题拓展: 上面涉及到了 += 和 s1 = s1 + 1 的区别,除了 +=
i = i++和i =++i
cainiao_xiaoniao的博客
01-31 1487
public class Count { public static void main(String[] args) { int i = 0; i = i++ ; System.out.println(i); } } 上面代码输出的i为0,如果是把i = i++换成i=++i,又会输出1,这是由于i++是先赋值,再计算导致,但是为什么先赋值呢? public static void main(String[] args) {
java i+=i++,i+=++i
Prodigal
06-17 1252
解释:i+=++i相当于i=i+ ++i; 相当于1+ ++1 = 1+2=3; 解释:i+=++i相当于i=i+ i++; 相当于1+ 1++ = 1+1=2;问:i++,和++i的运算级高,为什么加完之后没有赋值给第一个i? 答:因为加的时候,从前往后,依次进入栈空间计算,i=i+ ++i时,第一个i此时是1进入栈,第后面的i,自增完后进入栈,再......
C语言 & Java 解析:当 i = i++ 后,结果究竟是什么?
致力于C语言C++知识分享!
08-09 990
前言: 之前有朋友跟我讨论过一个问题,他问在java中,i=1;i=i++;之后的结果时什么,我一开始认为是2,但当他说答案是1的时候,我不得不想一个合理的解释,我想,可能是因为临时变量,当i赋值给i后,自增更改了临时变量,所以i值并没有改变。当我在为我的解释表示满意时,他们说在c语言下的答案是2,好吧,我只能说是编译器的实现不同,当然这个答案太没说服力了,所以寻找答案的任务就开始了。 我先在《c++ primer》上看见这样的解释:“++i的效率要比i++的效率高,因为i++必须要有一个临时变量来
Java 中的 i = i++ ,计算之后 i 值无变化的原因
伏念先生的博客
12-08 1349
Java 中的 i = i++ 问题 int i = 0; i = i++; System.out.println(i); // 0 问最后的输出结果是什么。我这两天才开始看 Java,第一眼就认为肯定是输出 1 ,但如果结果真的这么直观就不会出成笔试题了。实际运行一下,结果居然是输出 0。 如果把i = i++换成i = ++i或者干脆换成i++。输出结果就是 1 了。为了完...
python编写年金终值函数_年金终值的计算公式推导:F=A(1+i)0+A(1+i)1+A(1+i)2+...+A(1+i)n-2+A(1+i)n-...
weixin_39700215的博客
12-24 1548
共回答了22个问题采纳率:90.9%1、我估计你是这个意思:F=A(1+i)^0+A(1+i)^1+A(1+i)^2+……+A(1+i)^(n-2)+A(1+i)^(n-1)是怎样推导出公式:F=A(1+i)^[(n-1)/i]的?【注意:在网上“^”表示“次方”的意思】2、这里用到一个公式:a^0+a^1+a^2+a^3+……+a^(n-2)+a^(n-1)这是一个“等比数列”,其公比为“(1+...
Python中变量自增、i+=x与i=i+x、is与==
热门推荐
一蓑烟雨任平生 也无风雨也无晴
11-22 3万+
这篇博客可能比较low bee,但是对于一个掌握了其他语言,刚刚学习Python的人来说,也许会有一点点的帮助。在Cpp中,我们总是讨论前缀自增和后缀自增的效率问题:++i 是i=i+1,表达式的值就是i本身i++ 也是i=i+1,但表达式的值是加1前的副本,由于要先保存副本,因此效率低一些。那么我看python中的自增呢? ++i>>> i=1 >>> ++i 1i++>>> i=1 >>> i
从JVM角度理解i=i++和i=++i以及i=i++ + ++i
qq_57106792的博客
04-20 712
1.首先要了解什么是操作数栈和局部变量表(自行百度) 2.解释i=i++ (1) 局部变量表中:i=1,操作数栈中:i=1; (2)执行++操作(对局部变量表加)) 局部变量表中:i=2,操作数栈中:i=1; (3) 返回栈顶元素i=1,及此时的i=1 3.解释i=++i (1) 局部变量表中:i=1,操作数栈中:i=1; (2)执行++操作(对局部变量表加)) 局部变量表中:i=2,操作数栈中:i=1; (3) 返回栈顶元素i=2,及此时的i=2 ...
i++++i和i=i++的区别
conviction_thinking的专栏
09-05 2678
i=++i,i=i++和i++的区别 1.i=i++与i=++i的区别:i=i++是先赋值再自加,i=++i是先自加再赋值。 如:       public static void main(String[] args) {         int i=0;         i=i++;         System.out.println(i);     } 运行结果为:
深入剖析i=i++和i=++i
沉默的夏虫
04-13 998
首先说结果 public static void main(String[] args) { int i = 8; i = i++;//i的8先压入操作数栈,之后执行局部变量中的i自增1变为9,之后执行赋值 将操作数栈中的8弹出赋值给i,结果i最终为8 // i = ++i;//先执行局部变量中的i自增1变为9,之后i的9压入操作数栈,在之后执...
终于明白 i = i++和 i = ++i 的区别了!
勇往直前的专栏
07-28 956
写在前面:前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛… 直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。 为此,我也专门写一篇博客,记录我的学习!!! 1、题目 package pers.mobian.questions01; publicclasstest01{ publicstaticv...
i = i++和 i = ++i
大飞的博客
09-10 349
头疼 直接上题: public class Test { public static void main(String[] args) { int i = 1; i = i++; int j = i++; int k = i + ++i * i++; System.out.println(i); System.out.println(j); System.out.println(k);
正确理解i=i++ i+=i++ i=i++ + i++
gou456654的博客
08-27 680
最近笔试经常能够碰到i=i++的问题,这个问题还是比较简单,不过手贱的自己偏偏想去看看i+=i++,不看不要紧,一看看出了大问题 几个常识 1.result+=expression在所有语言当中都是等价于result=result+expression 2.int i=b++;这个操作是如何完成的呢,首先系统将内存栈中b的值拷贝到寄存器当中,然后将该拷贝值+1 将结果写到a中 步入正题
i = i++ 和 i = ++i 的区别
技术交互博客
09-01 1444
i = i++ 和 i = ++i 的区别?来看两段字节码吧.(1)int i = 1;i = i++;bytecode:0: iconst_11: istore_12: iload_13: iinc 1,16: istore_17: return (2)int i = 1;i = ++i;bytecode:0: iconst_11: istore_12: iinc
计算下列各程序段的时间复杂度。 (1) for(i = 0; i < n; i++) for(j = i; j < n; j++) x++; (2) i = n; while(i > 1) i=i/2; (3) for(i = 1; i <= n; i++) for(j = 1; j <=n; j++) for(k = 1; k <= n; k++) x++; (4) for(i = 1; i <= n; i++) for(j = 1; j <=n; j++) x++; for(k = 1; k <= n; k++) x++; (5) for(i = 1; i < n; i++) { j = i; while(j < n) j *= 2; } 请写出具体过程
最新发布
04-23
(3) 对于每个 i 和 j,内部循环k运行n次,因此总运行次数是 T(n) = n * n * n = n^3, 因此时间复杂度是 O(n^3)。 (4) 第一个循环运行n^2次,第二个循环运行n次,因此总运行次数是 T(n) = n^2 + n, 因此时间...
写文章

热门文章

  • 一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,堪称辅助神器! 20585
  • 因接外包坐牢456天,我都经历了什么? 15268
  • Springboot下Shiro+Token使用redis做安全认证方案 11964
  • 18 款低代码平台!开发解放双手! 11520
  • 13个超强的 SpringBoot 实战项目 (还不赶紧收藏起来) 9437

最新评论

  • 3 步完成 Spring Boot 的日志脱敏

    Zs33: 点赞好文

  • EasyExcel 带格式多线程导出百万数据(实测好用)

    绝代风华.: easyexcel不是不支持并发写吗

  • 这是我见过最全的SpringBoot运行教程(附源码+实例)

    天蓝999: 可以的,我看的另一个SpringBoot视频,从零开发,十天掌握了项目实战:https://knife.blog.csdn.net/article/details/134911141

  • 十分钟搞定 SpringBoot 集成 ChatGPT,实战附源码!

    只爱吃苹果: 你这个是一起返回的,流式的呢

  • 正式通知!本科以下学历直升本科,每人补贴8000元,政策扶持,名额有限,速看!...

    CSDN-Ada助手: 不知道 Python入门 技能树是否可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python

最新文章

  • 40多个专题的笔试题,史上最全!包含MyBatis、ZooKeeper、Dubbo、Elasticsearch、Redis等...
  • Spring、MyBatis、ZooKeeper、Dubbo、MongoDB等60种技术,【80万】字的加强版技术资料。...
  • 3个完美替代 Navicat 的工具,香~
2024年18篇
2023年126篇
2022年255篇
2021年235篇
2020年259篇
2019年84篇
2018年17篇
2017年147篇
2016年141篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王网站优化合同收纳九度网站优化软件常德咨询营销型网站优化松江区专业网站优化案例黔南都匀网站优化商丘百度网站优化有哪些益阳网站优化哈尔滨百度网站优化案例河北瓷砖行业网站优化推广渠道亳州百度网站优化哪家服务好最专业的seo网站优化网站优化在哪里学亳州做网站优化哪家不错玉田网站优化哪里不错优化网站就属金苹果26胶州网站建设优化推广鄄城县网站关键词优化如何优化网站结构大型网站运营优化从化网站排名推广优化费用行业供求信息网站怎么优化网站线上推广优化上海专业网站优化公司银川工业品网站优化网站优化如何做好百姓网标王包年推广稳定的网站核心词优化公司java东莞网站建设优化龙海网站的优化青岛提供网站优化费用香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化