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

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

2、第二题揭秘

先来看一下打印结果吧:


Java 运行结果:15a129edbb434db1ae6bc71294d8628a.png

C/C++ 运行结果:


cd214b3797ee4bb09a54471f04c84daf.png

可以清晰地看到 Java 的打印结果与 C/C++ 不同,在下面将做出我的解释。


2.1、Java 中的printf 是格式化输出

诸如 %d、%f、%s 分别代表着整型、浮点型、字符串类型的占位符,在进行打印的时候会被后续的变量替代。在 a 为 2 时, a++ 的结果为 2 ,自增后 a 变为 3,然后进行 ++a,结果为 4,而 Java 的打印结果也确实如此。


按照同样的理解,为什么 C/C++ 中的结果是 3 4 呢?这就涉及到了 函数调用约定 问题,printf 和 cout 参数是右向左进行入栈操作的。那到底这个入栈操作是怎么进行的呢,那就往下看看汇编的指令吧!


2.2、C/C++ 打印时按照从右向左顺序入栈

汇编层面解析 printf 函数执行顺序:


abc27b83005b45a08a5e7c2a4ca45218.png


由上面汇编指令得知执行流程为:


1.先处理最后一个参数 ++a:

通过 mov 传送指令将 内存中a对应的值传送到累加器 eax 中

累加器进行加 1 操作后将此值再次送回内存

2.然后处理参数 a++:

先将此时 a对应的值传送到寄存器 ecx 中,然后存储到另一个内存单元中,为了方便描述,将该内存单元称为 temp

mov 指令不允许两边的操作数同时为内存,因此使用 ecx 作为媒介

随后将 a 对应的值送到寄存器 edx 中并进行加 1 操作并重新送入原内存中

3.完后,将 a 对应的值传送到 eax 中通过 push 指令入栈,将 temp 内存对应的值送到 ecx 中也通过 push 入栈,最后将剩余字符串入栈,调用函数,完成打印。

结果分析:


a++ 的结果就是临时存储单元 temp 对应的结果,而此结果正是 3,++a 的结果就是累加器 eax 存储的值,该值经过两次 add 1 操作,从 2 变为了 4,最终结果也就是 4。这也正是C 语言printf 输出的结果。


3、 留一道课后作业

对于C++中的 cout 执行流程我便不做解释,过程与 printf 一致,都是右向左先进行入栈操作,看了这么多,来一个练习题吧:

a0fe0994038841ed9eeed517a7f9e3a6.png



最终打印结果为?我做个投票吧,一天后我在评论区公布答案,大家快来检验一波学习成果!



目录
相关文章
|
6天前
|
Java Android开发 C++
Java和C++
Java和C++
24 15
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
49 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
20 1
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
24 5
|
2月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
54 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 详细代码 图文等内容
100 3
WK
|
1月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
51 0
|
1月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
31 0
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
67 0