写在篇头:

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

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

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

x=1;   printf("%d %d\n",x,x++);
x=1;   printf("%d %d\n",x++,x);
x=1;   printf("%d %d %d\n",x,x++,x);
x=1;   printf("%d %d %d %d\n",x,++x,x++,x);

如是~:

2 1
1 2
2 1 2
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)

[小试身手]

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

答案:[ 6 7 4 7 2 7 ]

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

C语言初探 之 printf压栈顺序相关推荐

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

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

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

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

  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. (译)用多重赋值和元组解包提高python代码的可读性
  2. boost::system::windows_error相关的测试程序
  3. geek_How-To Geek正在寻找安全作家
  4. Spring –添加Spring MVC –第2部分
  5. 打印循环换行_一个案例轻松认识Python 循环语句(for)——10以内的素数
  6. android java tga转png_java 里.tga图片怎么用啊,是不是要导入一个包,真的找不到资源,希望来位大神帮帮我 小弟在此拜谢!...
  7. python编写一个登陆验证程序_用python实现一个简单的验证码
  8. BootStrap修改modal模态框的宽度
  9. [nvidia] CUDA_VISIBLE_DEVICES
  10. 关于更新内容次序问题
  11. 2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础
  12. 【第一部分】04Leetcode刷题
  13. git commit或pull后恢复到原来版本
  14. php版ueditor配置_ThinkPHP配置UEditor
  15. linux soruce 命令,Linux source命令是干啥的?
  16. c语言元音字母辅音字母,英语字母中的5个元音字母和21个辅音字母
  17. Invalid bound statement (not found): com.xingyu.demo.mapper.UserMapper.update错误
  18. Angular学习笔记——自定义指令directive参数详解
  19. 垃圾小白羊的leetcode刷题记录7
  20. 基于Android的招聘求职网站的设计与实现

热门文章

  1. MySQL 数据查询.多表查询.内连接
  2. 535.TinyURL 的加密与解密
  3. MySQL-查询篇(超详细)
  4. 当技术达到什么水平,才能顺利进入BAT?
  5. Linux之下载lz4压缩工具
  6. 校园导航类小程序 基本信息 编写建议( 包含 如何取名 及 logo选取)
  7. 转载_那些年,追过的开源软件和技术
  8. 23教资报名今日正式开始!这些资料填写一定要注意
  9. CSUST 2005 修仙 ( dp )
  10. ARM与 X86 CPU架构对比