C语言初探 之 printf压栈顺序(printf(%d %d %d %d %d %d\n,a++, ++a, a++, ++a, a++, ++a ))
写在篇头:
在不同的编译器下结果不同,本例测试的环境为 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 ]
(选中答案框看结果,你懂的~)
*********************************************************************************************************************************
调用printf()函数,因为此时的printf()函数的参数需要计算(是表达式),计算的方向是从左到右,同时需要保存这些结果。保存的方法是将它们压入堆栈。
- a=1;
- 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 ))相关推荐
- c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- C语言初探 之 printf压栈顺序
写在篇头: 在不同的编译器下结果不同,本例测试的环境为 devcpp5.3.0.1 . -------------------------------------------------------- ...
- 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 ...
最新文章
- Win32.Lioten.SG病毒
- 基于单目的3D人体姿态估计
- 第九章:文件系统管理
- 人工智能的策略,如果国家优先发展”梦想成真”?
- spring boot示例_Spring Boot上的Spring社交示例,或者我如何停止担心和喜欢自动配置...
- hsv白色h值是多少_ShaderToy系列:HSV
- 量子化学计算机理,几种化学反应机理的量子化学理论计算
- python模块cv2人脸识别_Python基于Opencv来快速实现人脸识别过程详解(完整版)
- paroot忘记root密码
- pandaboard 安装_pandaboard ES学习之旅——3 Uboot源码下载与编译
- php中关系运算符的优先级,PHP 运算符优先级
- 开题报告:基于java校园学校球馆运动场地预约系统 毕业设计论文开题报告模板
- 《MLB棒球创造营》:走近棒球运动·匹兹堡海盗队
- python访问字符串中的部分字符的操作_Python字符串基础操作
- cs1.6自动退出服务器,CS1.6菜单被流氓服务器修改
- ED1 SoC Linux环境搭建
- Qt5软键盘实现中文拼音输入法
- mysql 索引加锁分析
- 师范大学计算机专业研究生,2019考研调剂:福建师范大学计算机类学硕研究生调剂生...
- 字符串、字符长度计算