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



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



目录
相关文章
|
2月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
39 0
|
8天前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
33 1
|
14天前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
61 3
|
15天前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
19 1
|
16天前
|
缓存 并行计算 Java
C++矢量运算与java矢量运算
本文探讨了C++和Java中的矢量运算与标量运算的性能比较,解释了矢量运算的原理和为什么它比标量运算快,包括并行性、数据局部性、指令优化和数据重用等优势。文章还提供了C++和Java的矢量运算示例代码,并展示了运行结果,以证明矢量运算在处理大量数据时的性能优势。
12 0
C++矢量运算与java矢量运算
|
1月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
83 1
|
2月前
|
Rust 安全 Java
Java代码规范--排版,命名.:Rust能否撼动C++的王座?
系统编程是计算机科学的核心,C++长期占据主导地位,但其内存安全问题备受诟病。Rust以安全性为核心,通过所有权和生命周期概念避免了野指针和内存泄漏。此外,Rust的并发模型和日益丰富的生态系统使其成为现代系统编程的新选择,尤其在安全性和并发性方面表现出色。尽管C++依然强大,但Rust为开发者提供了更安全、易管理的选项,未来有望推动更多系统级应用的发展。
22 0
|
2月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
33 0
|
2月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
59 0
|
2月前
|
算法 Java Linux
Intellij Java JNI 调用 C++
Intellij Java JNI 调用 C++
34 0