C/C++---printf/cout 从右至左压栈顺序实例详解
__cdecl压栈顺序实例
- 明白计算:计算是从右到左计算的
- 栈和寄存器变量:x++,是将计算结果存放到栈空间,最后是要出栈的;而++x和x是将计算结果直接存放到某个寄存器变量中(是同一个),所以计算完最后输出时,++x和x的结果总是相同的。
用个小例子来说明下:
int x=5; printf("%d %d\n",x,x++);
int y=5; printf("%d %d\n",y++,y);
int z=5; printf("%d %d %d\n",z,z++,z);
int w=5; printf("%d %d %d %d\n",w,++w,w++,w); /*输出结果*/
6 5
5 6
6 5 6
7 7 5 7
【解释说明】
从右至左计算,对于x,x++为5,压入栈中,再是x,为6,放寄存器中,然后输出,则输出6 5;
从右至左计算,对于y,先是计算y,这时值是5,放入寄存器中,然后计算y++,结果还是5,压入栈中,但是寄存器中值变了,为6,
最后开始输出。输出的话,是压入栈(y++)中的就输出对应的值,不是压入栈(y)的就都是寄存器中的值。
从右至左计算,对于z,z为5,放寄存器中,z++,还为5,压入栈中,z则为6了,寄存器值改变为6,然后输出,则输出为6 5 6;
同理可得其他的计算结果。
C/C++---printf/cout 从右至左压栈顺序实例详解的更多相关文章
- 5-2-2 printf参数从右往左压栈
5-2-2 C中printf计算参数时是从右到左压栈的 #include <stdio.h> int main (int argc, char **argv) { ; ,,,,}; int ...
- printf计算参数是从右到左压栈的(a++和++a的压栈的区别)
一.问题 c++代码: #include <iostream> #include <stdio.h> using namespace std; int main(){ ; co ...
- C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)
上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇 ...
- thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上" ...
- C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
题目描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 输入描述: 输入一个int型整数 输出描述: 按照从右向左的阅读顺序,返回一个不含重复数字的新的整数 输入例子 ...
- cout是右结合的
cout是右结合的,(从右到左压栈?) cout<<++a<<","<<a++; 的运行顺序是 1.a的值压栈 2.a自加 3.‘,’压栈 4 ...
- printf()函数压栈a++与++a的输出
printf()中a++与++a的输出问题 在C语言中有个很常用的函数printf(),使用时从右向左压栈,也就是说在printf("%d %d %d %d\n",a,a++,++ ...
- printf函数压栈解惑
最近看到一些程序员的笔试题目,经常会考到printf函数的参数压栈问题,总体来讲就是参数从右向左依次压栈,再出栈,但是今天看到一个看似很简单的题目,却一直找不到头绪.题目如下: #include &l ...
随机推荐
- 公司HBase基准性能测试之准备篇
本次测试主要评估线上HBase的整体性能,量化当前HBase的性能指标,对各种场景下HBase性能表现进行评估,为业务应用提供参考. 测试环境 测试环境包括测试过程中HBase集群的拓扑结构.以及需要 ...
- CentOS环境下jdk安装部署
1.准备jdk安装文件: 这里我使用的是 jdk-7u79-linux-x64.tar.gz 2.在 /usr/local 目录下创建 sotfware目录,并上传JDK文件: 解压文件并修改文件夹为 ...
- 注意:darknet安装
参考:https://github.com/AlexeyAB/darknet # 一.安装 ## linux下安装 - 在darknet目录下执行make ## windows下安装 1. 安装vs2 ...
- HDU 5512 - Pagodas - [gcd解决博弈]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5512 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- df and du
1.若有进程在占用某个文件,而其他进程把这文件删掉,只会删除其在磁盘中的标记,而不会释放其占用的磁盘空间:直到所有访问该文件的进程退出为止: 2.df 是从内核中获取磁盘占用情况数据的,而du是统计当 ...
- PHP AOP编程思想
AOP思想(面向切面编程) 在应用开发中,我们经常发现需要很多功能,这些功能需要经常被分散在代码中的多个点上,但是这些点事实上跟实际业务没有任何关联.比如,在执行一些特殊任务之前需要确保用户是在登陆状 ...
- LightOj 1248 - Dice (III)(几何分布+期望)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1248 题意:有一个 n 面的骰子,问至少看到所有的面一次的所需 掷骰子 的 次数的期望 ...
- [转]基于S2SH框架的项目—antlr-2.7.2.jar包冲突问题
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I org.hibernate.hql.ast.HqlSqlWal ...
- pycharm 使用激活补丁永久激活+汉化
提供激活补丁激活方式(推荐使用-使用期到2100年,基本永久啦) 破解补丁激活 1.下载 https://pan.baidu.com/s/1GehNMTXagUxUEted1DT-Pg 密码:6689 ...
- MySql操作语句集锦
Windows服务 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意 ...