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

这篇具有很好参考价值的文章主要介绍了C语言中关于printf()输出的时候的一个出栈入栈问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看一段代码,可以自己尝试一下,反正我当时尝试的时候好多搞不懂,
不过现在搞懂了,里面牵扯到了一个入栈和出栈的问题,文章来源地址https://www.toymoban.com/news/detail-696121.html


官方解释是这个:



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

大白话解释:

挑选一个举个例子:
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没关系了)

#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;
}

到了这里,关于C语言中关于printf()输出的时候的一个出栈入栈问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 链栈(入栈,出栈,遍历)

    链式存储结构可以更好的避免栈上溢,因为顺序栈在定义结构体时需要定义最大值。 栈的链式存储结构就是链栈,栈底就是链表的最后一个结点,而栈顶是链表的第一个结点,一个链栈可以由栈顶指针top唯一确定。 结构体的定义: 运行结果:  多重链栈用到结构体数组这一

    2024年02月06日
    浏览(26)
  • 顺序栈的初始化、构建、入栈,出栈和取栈顶元素

    算法步骤: ①为顺序栈分配一个最大容量为MAXSIZE的数组空间,使base指向这段空间的基地址(栈底); ②栈顶指针top初始为base,表示栈为空; ③stacksize置为栈的最大容量MAXSIZE; 算法步骤: ①判断栈是否为满,若满则返回ERROR; ②将新元素压入栈顶,栈顶指针+1; 算法步

    2024年02月07日
    浏览(35)
  • 数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)

    目录 前言 栈 1.定义 2.栈的特点 3.栈的储存方式 3.1数组栈 3.2链栈  4.栈的基本操作(C语言) 4.1初始化   4.2判断是否满栈 4.3判断空栈  4.4 入栈 4.5 出栈 4.6获取栈顶元素  4.7遍历栈  4.8清空栈  完整代码示例         大家好呀!今天我们开始学习新的线性表结构----栈,前面

    2024年02月06日
    浏览(25)
  • 【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码

    只允许在一端进行插入操作或删除的线性表。 重要术语 栈顶:允许 插入和删除的一端。 栈底:不允许 插入删除的一端。 空栈:不含任何元素的空表。 出栈顺序(卡特兰数): n个不同元素进栈,出栈元素不同排列的个数: 1 n + 1 C 2 n n frac{1}{n+1} quad C_{2n}^n n + 1 1 ​ C 2 n n ​

    2024年02月11日
    浏览(27)
  • 数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)

    前言: 在前面的文章中,我们讲解了 顺序表,单链表,双向链表 。而我们今天要分享的栈则是基于之前的数据结构上搭建的,但是相较于顺序表和链表来说,栈的实现就非常简单了。 目录 一.栈(Stack)的概念 二.栈的数据结构 三.栈的实现 判断栈已满 判断栈非空 入栈push 出栈

    2024年02月05日
    浏览(25)
  • 【 第4关:入栈和出栈的基本操作】【编程题实训-栈】【头歌】【bjfu-243】

    本关任务:输入一个整数序列a1,a2,a3…,an。当ai不等于-1时将ai进栈;当ai=-1时,输出栈顶元素并将其出栈。 输入 多组数据,每组数据有两行,第一行为序列的长度n,第二行为n个整数,整数之间用空格分隔。当n=0时输入结束。 输出 对于每一组数据输出若干行。每行为相应的出

    2024年02月06日
    浏览(34)
  • 已知n个数的入栈序列,求一共有多少种出栈序列 (卡特兰数)

    这个经典问题有两种解法。 解法一: 设 (f(x)) 为 (x) 个数入栈后,再全部出栈的序列数量 假设我们有 (4) 个数 (a,b,c,d) , 我们来看 (a) 的出栈顺序. 假如 (a) 第一个出栈,那么后面还有 (3) 个数没有出栈,因此方法数是 (f(3)) . 假设 (a) 第二个出栈,那么 (a) 的前面有

    2023年04月23日
    浏览(25)
  • 【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰   目录 ⭐栈的分类 ✨顺序栈 🎈优点: 🎈缺点: ✨链栈 🎈优点: 🎈缺点: ⭐基本概念 ✨栈: ✨栈顶: ✨栈顶: ✨图片理

    2023年04月22日
    浏览(39)
  • 【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

       堆栈Stack 和 队列Queue 是两种非常重要的数据结构,两者都是特殊的线性表: 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。    堆

    2024年02月07日
    浏览(36)
  • C语言--输出格式控制(printf函数)--宽度精度控制

    格式输出函数printf printf(格式控制,输出表列) 格式字符 功能 例子 d 输出一个有符号的十进制整数 printf(\\\"%d  %d\\\",12,-56); c 输出一个字符     char ch =\\\'a\\\';     printf(\\\"%c\\\",ch); s 输出一个字符串 printf(\\\"%s\\\",\\\"oh my god\\\"); f 输出实数(包括单、双精度、长双精度), 以小数形式输出,默认输

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包