i = i++ 计算过程还不会?C/C++ 的输出语句与Java 有何不同?(上)

简介: i = i++ 计算过程还不会?C/C++ 的输出语句与Java 有何不同?

🔥前言

最近身边的朋友分享了一些有趣的算法题给我,我看到题后直接不假思索的说出了我的答案,然而没有一道说对的,顿时我的脾气就上来了,通过查阅资料并与同学讨论,最终从语言特点以及汇编层面解决了问题。接下来我把三道题目放出来,大家尽情作答,看看你是否能成功入坑。


第一题:你觉得 i 的结果为多少?A. 99 B. 100 C. 0


6da0df34d804442e85344ed912c62c06.png


第二题:C/C++以及Java 输出的结果会不会相同呢?A. 相同 B. 不相同

745e0cecc3ff4faf9a5c92394dbc1af2.png

e29cd6034f8f4c7b8012ee8127669fd0.png



1、第一题揭秘

正确答案应该是 0:



846897d527f34120b598806e99815521.png

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 操作直接按照字面意思理解即可。


目录
相关文章
|
17天前
|
Java Android开发 C++
Java和C++
Java和C++
34 15
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
63 2
|
1月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
32 1
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
25 5
|
2月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
59 1
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
111 3
WK
|
1月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
56 0
|
1月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
39 0
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
91 0