写在篇头:

在不同的编译器下结果不同,本例测试的环境为 devcpp5.3.0.1 。

——————————————————————————————————————————————————————————————————————

先看一段代码,猜猜会是什么输出:

[cpp]  view plain copy print ?
  1. x=1;   printf("%d %d\n",x,x++);
  2. x=1;   printf("%d %d\n",x++,x);
  3. x=1;   printf("%d %d %d\n",x,x++,x);
  4. x=1;   printf("%d %d %d %d\n",x,++x,x++,x);

如是~:

[html]  view plain copy print ?
  1. 2 1
  2. 1 2
  3. 2 1 2
  4. 3 3 1 3

看到这里,你会发现,有时看起来是从左往右算,有时候是从右往左算,有时候还是从乱序算。。是不是有些郁闷呢。

其实,在处理printf时,压栈顺序为从右往左,也就是说从右往左的计算(“计算”不等于“输出”)。

在计算时,遇到x++会记录此时的x的值作为最后的输出结果。遇到x和++x的时候则不会将此时的计算结果作为最终的输出,只会修改x的值,在最终输出的时候都输出x的值(所以++x和x的结果总是一样的)。

为什么会是这个样子呢?参见某高手解释吧:

对于a++的结果,是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;而对于++a的结果,则直接压寄存器变量,寄存器经过了所有的自增操作。 (来源:http://www.zzzj.com/html/20090609/71613.html)

[小试身手]

[cpp]  view plain copy print ?
  1. a=1;
  2. printf("%d %d %d %d %d %d\n",a++, ++a, a++, ++a, a++, ++a );

答案:[ 6 7 4 7 2 7 ]

(选中答案框看结果,你懂的~)

*********************************************************************************************************************************

调用printf()函数,因为此时的printf()函数的参数需要计算(是表达式),计算的方向是从左到右,同时需要保存这些结果。保存的方法是将它们压入堆栈。

  1. a=1;
  2. printf("%d %d %d %d %d %d\n",a++, ++a, a++, ++a, a++, ++a );

注意这里的a++和++a计算有些特殊

自增运算常理值: 6     6    4    4    2   2

a++, ++a, a++, ++a, a++, ++a

a++:                     6                   4                 2

最后的结果             6         7        4       7        2      7

这几个连续的自增运算使得a最后的值为7。

a++的值在运算过程中就能确定;

而所有++a或者a(如果有)的值是所有对a的值产生影响的运算之后最终的值。

*********************************************************************************************************************************

C语言初探 之 printf压栈顺序(printf(%d %d %d %d %d %d\n,a++, ++a, a++, ++a, a++, ++a ))相关推荐

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

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

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

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

  3. C、C++语言中参数的压栈顺序

    要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,-) 没错,它是一个不定参函数,那么我们在实际使用中是怎么样知道它的参 ...

  4. C语言printf压栈问题

    1. 事出有因 今天在刷面试题的时候遇到如下一个面试题: #include <stdio.h> #include <stdlib.h>int main() {int arr[] ...

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

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

  6. printf压栈出栈

    printf函数的压栈顺序是从右到左压栈,计算表达式值的顺序也是从右到左,由于输入数据类型的多样性,压栈的时候将数据或数据的地址mov到寄存器中,然后将寄存器压栈 例子: #include <i ...

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

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

  8. c语言局部变量压栈顺序,C 程序局部变量压栈出栈的理解

    写这篇总结的缘由仅仅出于巧合,五一前帮一位同学看51的程序,在查看汇编代码的时候(事实上我当时的汇编知识基本都还给了老师),无意中问起我"某个局部变量的声明怎么没有对应的汇编语句" ...

  9. printf压栈问题[保姆级教程]

    前言 当printf遇上了i++和++i 当我看到这个代码的时候,突然就对printf和i++产生了疑问. i=1; printf("%d %d\n",i,i++) // 2 1 ...

最新文章

  1. Win32.Lioten.SG病毒
  2. 基于单目的3D人体姿态估计
  3. 第九章:文件系统管理
  4. 人工智能的策略,如果国家优先发展”梦想成真”?
  5. spring boot示例_Spring Boot上的Spring社交示例,或者我如何停止担心和喜欢自动配置...
  6. hsv白色h值是多少_ShaderToy系列:HSV
  7. 量子化学计算机理,几种化学反应机理的量子化学理论计算
  8. python模块cv2人脸识别_Python基于Opencv来快速实现人脸识别过程详解(完整版)
  9. paroot忘记root密码
  10. pandaboard 安装_pandaboard ES学习之旅——3 Uboot源码下载与编译
  11. php中关系运算符的优先级,PHP 运算符优先级
  12. 开题报告:基于java校园学校球馆运动场地预约系统 毕业设计论文开题报告模板
  13. 《MLB棒球创造营》:走近棒球运动·匹兹堡海盗队
  14. python访问字符串中的部分字符的操作_Python字符串基础操作
  15. cs1.6自动退出服务器,CS1.6菜单被流氓服务器修改
  16. ED1 SoC Linux环境搭建
  17. Qt5软键盘实现中文拼音输入法
  18. mysql 索引加锁分析
  19. 师范大学计算机专业研究生,2019考研调剂:福建师范大学计算机类学硕研究生调剂生...
  20. 字符串、字符长度计算

热门文章

  1. 用最通俗易懂的方式掌握动态组件和插槽
  2. 对新手站长来说如何掌握B2B网站推广的技巧
  3. 使用axFramerControl,打开Excel文件(后缀为.xlsx)的时候一直出错。提示调用目标发生异常
  4. 【在线社交功能】炫弛世界元宇宙商城
  5. WebApp打开服务器端pdf文件
  6. 【电商】电商后台设计—商品模块
  7. 1、linux中恢复使用rm删除的文件
  8. linux php pear 安装,全面解析ubuntu下安装php、pear
  9. 《NLP直播课打卡》第二天:千言文本相似度比赛全流程
  10. cesium-地面裁剪(多个剪切面)