C语言中关于printf()输出的时候的一个出栈入栈问题

先看一段代码,可以自己尝试一下,反正我当时尝试的时候好多搞不懂,

不过现在搞懂了,里面牵扯到了一个入栈和出栈的问题,


官方解释是这个:


c 复制代码
因为C语言函数参数入栈顺序是从右到左的,所以计算顺序是从右到左开始计算的;对于a++的结果,
是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;
而对于++a的结果,则直接压寄存器变量,寄存器经过了所有的自增操作。

大白话解释:

c 复制代码
挑选一个举个例子:
printf("%s,%d\n\n", (zp++)->name, (++zp)->age);

从右开始往左扫描,先扫描到(++zp)->age,
对于"++zp"那么计算机会先进行zp的自增操作,然后把zp放到一个寄存器变量中
(直白点就是暂时放到一边,暂时不进行zp->age的指向,等整个printf扫描一遍扫描完了然后再进行zp->age指向)
但是之后的扫描过程中zp的值是寄存器变量中的那个值,也就是zp=zp+1的值,

然后扫描到了(zp++)->name,
对于"zp++",计算机会先进行把zp->name 所指向的值存在栈空间中,然后再进行zp = zp+1  操作
(直白点就是说zp->name这个值已经定了,不管你printf扫描完还是没扫描完zp怎么变都跟我zp->name没关系了)
c 复制代码
#include <stdio.h>
struct Person{
	char name[20];
	int age;
};
int main()
{
    struct Person *zp, p[3] = {
		{"wang",12},
		{"liu",13},
		{"zhang",14}
	};
	zp = p;
	
	printf("%s,%d\n\n", (zp++)->name, zp->age);  //wang 13

	zp = p;//初始化
	printf("%s,%d\n\n", zp->name, (zp++)->age);  //liu 12

	zp = p;//初始化
	printf("%s,%d\n\n", (zp++)->name, zp->age);   //wang 13

	zp = p;//初始化
	printf("%s,%d\n\n", zp->name, (zp++)->age);   //liu 12

	zp = p;//初始化
	printf("%s,%d\n\n", (zp++)->name, (++zp)->age);   //liu 14

   return 0;
}
相关推荐
zh_xuan32 分钟前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊1 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1181 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之2 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
apocelipes2 小时前
Linux c 运行时获取动态库所在路径
linux·c语言·linux编程
豆沙沙包?2 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头2 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu3 小时前
java内存模型JMM
java·开发语言
int型码农3 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
我很好我还能学4 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++