要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,…)

没错,它是一个不定参函数,那么我们在实际使用中是怎么样知道它的参数个数呢?这就要靠format了,编译器通过format中的%占位符的个数来确定参数的个数。

现在我们假设参数的压栈顺序是从左到右的,这时,函数调用的时候,format最先进栈,之后是各个参数进栈,最后pc进栈,此时,由于format先进栈了,上面压着未知个数的参数,想要知道参数的个数,必须找到format,而要找到format,必须要知道参数的个数,这样就陷入了一个无法求解的死循环了!!

而如果把参数从右到左压栈,情况又是怎么样的?函数调用时,先把若干个参数都压入栈中,再压format,最后压pc,这样一来,栈顶指针加2便找到了format,通过format中的%占位符,取得后面参数的个数,从而正确取得所有参数。

所以,如果不存在…这种不定参的函数,则参数的压栈顺序无论是从左到右还是从右到左都是没关系的。

转载于:https://www.cnblogs.com/mini-coconut/p/9267469.html

C、C++语言中参数的压栈顺序相关推荐

  1. c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?

    看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...

  2. C/C++语言函数中参数的入栈顺序

    对于函数,之前认为会用就行了,对其中的原理并不是很了解,就比如函数中参数的入栈顺序(在这说明一下,函数的参数是保存在栈中的,还有一些局部变量也是存放在栈中),这个问题来源于某互联网的面试题,当然答得很 ...

  3. C语言初探 之 printf压栈顺序(printf(%d %d %d %d %d %d\n,a++, ++a, a++, ++a, a++, ++a ))

    写在篇头: 在不同的编译器下结果不同,本例测试的环境为 devcpp5.3.0.1 . -------------------------------------------------------- ...

  4. C语言初探 之 printf压栈顺序

    写在篇头: 在不同的编译器下结果不同,本例测试的环境为 devcpp5.3.0.1 . -------------------------------------------------------- ...

  5. C语言函数参数压栈顺序为何是从右到左?

    #转载自:http://blog.csdn.net/jiange_zh 上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是 ...

  6. 函数压栈的简解(计算顺序与压栈顺序)

    重点: 函数有两个概念(压栈顺序和计算顺序) 压栈顺序知识点 1.栈是先进后出的结构 2.ebp:基地址寄存器 (栈底) esp:栈指针 (栈顶) 3.栈底到栈顶的内存地址是由高到低.就是10-> ...

  7. python操作符顺序_Python语言中的操作符与运算顺序

    在新鲜出炉的9月TIOBE编程语言排行榜上,Python历史性的挤下C++,次进入前三位,Python的热度也以肉眼可见的速度快速上涨着,学习Python的人越来越多,不只是成人,很多青少儿也选择从P ...

  8. (十一)C语言中内存堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...

  9. Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

最新文章

  1. 投资的境界:及时抓住机会或止损才是硬道理
  2. c# 设计原则需要学习吗_向最好的学习:产品设计原则
  3. 火狐浏览器摄像头权限怎么开启 火狐浏览器摄像头权限开启的方法
  4. JavaScript学习(四十三)—构造方法创建对象的图解和注意事项
  5. Autolayout的简单介绍和示例代码
  6. threadlocal使用场景_ThreadLocal有没有内存泄漏?源码给你安排得明明白白
  7. 差分硬盘的merge(合并差异)实验分析
  8. 信息熵 条件熵 信息增益 信息增益比 GINI系数
  9. SQL 分页查询 返回总条数
  10. Mac下Chrome添加.crx浏览器插件
  11. 【货位优化】基于遗传算法实现仓库货位优化问题含Matlab源码
  12. 代理的原理及类型总结
  13. pyenv管理虚拟环境
  14. 元宵节动画贺卡制作_2017鸡年元宵节flash电子贺卡模板下载-2017元宵节电子贺卡flash动画模板完整打包下载-东坡下载...
  15. 读史使人明智,读诗使人灵秀,数学使人周密,科学使人深刻,伦理学使人庄重,逻辑修辞之学使人善辩:凡有所学,皆成性格。
  16. 【 MATLAB 】gca 介绍(当前轴或图表)
  17. vue项目设置ip访问
  18. BG2RHE - 树莓派3B+外置wifi解决金属外壳屏蔽问题
  19. 分布式任务调度系统设计:详解Go实现任务编排与工作流
  20. java重写的目的是什么_什么是重写?重写的作用?

热门文章

  1. android通知背景色,android – 更改通知RemoteViews背景颜色
  2. 如何利用python实现qq聊天_用Python写一个模拟qq聊天小程序的代码实例
  3. c++卸载工具_IIS修复IIS出现错误后如何完全卸载重装
  4. spring 事务的实现方式和原理_spring整合atomikos实现分布式事务
  5. Idea svn 新文件自动添加到版本控制
  6. spring中@Value注解使用
  7. Android开发笔记(一百五十六)通过渲染纹理展示地球仪
  8. cjson 使用时遇到的问题找不到库
  9. JavaScript设计模式-工厂方法模式
  10. SQLPrompt 安装后sql上看不到菜单