关于cout和printf的压栈顺序问题
2015-12-07 19:42
225 查看
原文地址:http://blog.csdn.net/zhanghenglei/article/details/7320291
如果有这样一个函数:
int max(int a, int b);
我这样调用它:
int x = 10;
int y = 6;
int z = max(x, y);
生成代码时,必然是y先入栈,然后x入栈,再call max。这就是右序入栈,c/c++的默认方式。
但是,如果在调用时,以表达式做为参数,又会怎么样呢?看下面
int z = max(x - y, x + y);
要知道,在调用max的时候,不可能把x + y这样的整个表达式入栈,必须求出表达式的值,然后将表达式的值做为
函数调用的参数入栈。可是,这里有两个表达式:x-y 和 x+y,那么先应该求x-y的值,还是先求出x+y的值?
c/c++语言都没有规定这个顺序,编译器实现可以自己定义。也就是说,一个编译器,可以先求出x+y的值,再求x
-y的值,然后将x+y的值入栈,然后再将x-y的值入栈,调用max。也可以先求出x-y的值,再求x+y的值,然后将x+y
值入栈,然后再将x-y的值入栈,调用max。 参数求值顺序不定,但是参数入栈顺序确定。
如果有这样一个函数:
int max(int a, int b);
我这样调用它:
int x = 10;
int y = 6;
int z = max(x, y);
生成代码时,必然是y先入栈,然后x入栈,再call max。这就是右序入栈,c/c++的默认方式。
但是,如果在调用时,以表达式做为参数,又会怎么样呢?看下面
int z = max(x - y, x + y);
要知道,在调用max的时候,不可能把x + y这样的整个表达式入栈,必须求出表达式的值,然后将表达式的值做为
函数调用的参数入栈。可是,这里有两个表达式:x-y 和 x+y,那么先应该求x-y的值,还是先求出x+y的值?
c/c++语言都没有规定这个顺序,编译器实现可以自己定义。也就是说,一个编译器,可以先求出x+y的值,再求x
-y的值,然后将x+y的值入栈,然后再将x-y的值入栈,调用max。也可以先求出x-y的值,再求x+y的值,然后将x+y
值入栈,然后再将x-y的值入栈,调用max。 参数求值顺序不定,但是参数入栈顺序确定。
相关文章推荐
- 路由器启动的顺序
- 详解C语言中printf输出的相关函数
- php实现插入数组但不影响原有顺序的方法
- PHP echo,print,printf,sprintf函数之间的区别与用法详解
- C++程序的执行顺序结构以及关系和逻辑运算符讲解
- js 程序执行与顺序实现详解
- php printf输出格式使用说明
- PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
- php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
- C语言printf详细解析
- 浅析C++中cout的运行机制
- 在输入输出字符串时scanf(),printf()和gets(),puts()的区别浅谈
- php中sprintf与printf函数用法区别解析
- C语言线性表的顺序表示与实现实例详解
- 浅析Java中print、printf、println的区别
- java队列实现方法(顺序队列,链式队列,循环队列)
- Swift中初始化方法的顺序介绍
- 关于循环队列的一些讲解
- printf的返回值问题(转)
- linux内核中printf函数实现原理分析