🔥前言
最近身边的朋友分享了一些有趣的算法题给我,我看到题后直接不假思索的说出了我的答案,然而没有一道说对的,顿时我的脾气就上来了,通过查阅资料并与同学讨论,最终从语言特点以及汇编层面解决了问题。接下来我把三道题目放出来,大家尽情作答,看看你是否能成功入坑。
第一题:你觉得 i 的结果为多少?A. 99 B. 100 C. 0
第二题:C/C++以及Java 输出的结果会不会相同呢?A. 相同 B. 不相同
1、第一题揭秘
正确答案应该是 0:
1.1、认为是100 的原因
i = 0; i = i++;
如上,i++ 即0++,把结果0 赋给 i,然后再进行加1操作,for 循环了100次,那么最终 i 也递增了100次,答案为什么不是100??
实际上,i 确实递增了,但是属于 “无效递增”。
1.2、0 的正确打开方式
不妨从 JVM 内存模型上分析,赋值运算符两边会分别进入内存中的两个部分,前者是局部变量表,后者是操作数栈,对于i = 0来说,0会先进入操作数栈,i 进入局部变量表中,操作数栈弹出栈顶元素赋值给局部变量,也就是把 0 赋值给了 i;那么对于i = i++,i++ 首先入操作数栈,也就是操作数栈的栈顶是0++ ,局部变量表中的 i 会进行自增变为 1,最终操作数栈弹出栈顶,将 0 赋值给局部变量表中的 i。这样无论进行多少次赋值操作,最终 i 的结果只能是 0。
而对于 i = ++i,操作数栈中进入的是 ++i,也就是操作数栈的栈顶元素等于1,局部变量表中的 i 自增后结果也是1,最后弹出栈赋值结果也会是1,因此对于 ++i 操作直接按照字面意思理解即可。