C语言初探 之 printf压栈顺序
写在篇头:
在不同的编译器下结果不同,本例测试的环境为 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压栈顺序相关推荐
- C语言初探 之 printf压栈顺序(printf(%d %d %d %d %d %d\n,a++, ++a, a++, ++a, a++, ++a ))
写在篇头: 在不同的编译器下结果不同,本例测试的环境为 devcpp5.3.0.1 . -------------------------------------------------------- ...
- c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- C、C++语言中参数的压栈顺序
要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,-) 没错,它是一个不定参函数,那么我们在实际使用中是怎么样知道它的参 ...
- C语言printf压栈问题
1. 事出有因 今天在刷面试题的时候遇到如下一个面试题: #include <stdio.h> #include <stdlib.h>int main() {int arr[] ...
- C语言函数参数压栈顺序为何是从右到左?
#转载自:http://blog.csdn.net/jiange_zh 上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是 ...
- printf压栈出栈
printf函数的压栈顺序是从右到左压栈,计算表达式值的顺序也是从右到左,由于输入数据类型的多样性,压栈的时候将数据或数据的地址mov到寄存器中,然后将寄存器压栈 例子: #include <i ...
- 函数压栈的简解(计算顺序与压栈顺序)
重点: 函数有两个概念(压栈顺序和计算顺序) 压栈顺序知识点 1.栈是先进后出的结构 2.ebp:基地址寄存器 (栈底) esp:栈指针 (栈顶) 3.栈底到栈顶的内存地址是由高到低.就是10-> ...
- c语言局部变量压栈顺序,C 程序局部变量压栈出栈的理解
写这篇总结的缘由仅仅出于巧合,五一前帮一位同学看51的程序,在查看汇编代码的时候(事实上我当时的汇编知识基本都还给了老师),无意中问起我"某个局部变量的声明怎么没有对应的汇编语句" ...
- printf压栈问题[保姆级教程]
前言 当printf遇上了i++和++i 当我看到这个代码的时候,突然就对printf和i++产生了疑问. i=1; printf("%d %d\n",i,i++) // 2 1 ...
最新文章
- (译)用多重赋值和元组解包提高python代码的可读性
- boost::system::windows_error相关的测试程序
- geek_How-To Geek正在寻找安全作家
- Spring –添加Spring MVC –第2部分
- 打印循环换行_一个案例轻松认识Python 循环语句(for)——10以内的素数
- android java tga转png_java 里.tga图片怎么用啊,是不是要导入一个包,真的找不到资源,希望来位大神帮帮我 小弟在此拜谢!...
- python编写一个登陆验证程序_用python实现一个简单的验证码
- BootStrap修改modal模态框的宽度
- [nvidia] CUDA_VISIBLE_DEVICES
- 关于更新内容次序问题
- 2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础
- 【第一部分】04Leetcode刷题
- git commit或pull后恢复到原来版本
- php版ueditor配置_ThinkPHP配置UEditor
- linux soruce 命令,Linux source命令是干啥的?
- c语言元音字母辅音字母,英语字母中的5个元音字母和21个辅音字母
- Invalid bound statement (not found): com.xingyu.demo.mapper.UserMapper.update错误
- Angular学习笔记——自定义指令directive参数详解
- 垃圾小白羊的leetcode刷题记录7
- 基于Android的招聘求职网站的设计与实现