为什么C/C++的参数入栈顺序是从右向左?

相关连接

(1)http://www.cnblogs.com/chinazhangjie/archive/2012/08/18/2645475.html

(2)http://bbs.csdn.net/topics/390882650

(3)http://bbs.csdn.net/topics/390882650

看了前辈们的交流和经验后,自己做个小总结,以备忘。

答:采用这种顺序,是为了让程序员在使用C/C++的“函数参数长度可变”这个特性时更方便。

什么是“函数参数长度可变”?printf就是一个例子,它的参数的个数就是可变的,链接(1)中介绍了如何自己写一个参数长度可变的函数。

看下面这句话 printf("%d %d %d",1,2,3),在采用从右向左的参数入栈顺序时,参数出栈顺序时"%d %d %d",1,2,3。

如果采用从左向右的入栈顺序,则出栈顺序变为3,2,1,"%d %d %d"。

当然,不管是采用哪种顺序,printf的功能都可以实现的。但是,如果采用后者,当处理printf("%d %d %d",1,2,3,4,5,6)时,就会造成不必要的工作,因为如果按照这个顺序,就需要先存储所有六个参数(1,2.3,4,5,6),而后才能根据“%d %d %d”来判断出4,5,6,是不需要的。如果按照这个顺序,其实问题也可以解决,方法就是把printf的参数顺序设计成这样printf(6,5,4,3,2,1,“%d %d %d”),这样处理效率就会提高。但是这种设计显然不方便程序员使用。

从上面的例子中,我们可以看出“从右向左”的入栈顺序的合理性所在。

补注:

最近又翻到了这个问题,发现了一篇新的解读,觉得不错,链接如下:

http://blog.csdn.net/xxxxxx91116/article/details/40478173

该文大致意思如下:

从右向左压栈的顺序是与C/C++支持可变参数有关的。C/C++要求在声明参数可变的函数时,需要有至少一个确定的参数。为什么呢?因为需要有一个参数为函数提供可变参数的类型(否则函数怎么知道如何解析后续的可变参数?比如,可变参数列表中有两个参数,一个int型,一个byte型,函数在解析可变参数表时,怎么知道这5字节的数据到底应该如何去解析。)如果一个可变参数的参数类型事先确定的话,这个参数就没有存在的意义了。当然,用其它的一些方法也可以代替第一个参数的功用,比如在调用函数前先填写一个配置文件,函数被调用后,首先读取该配置文件,然后再解析可变参数表,但是这样做的实质是和用一个参数来传入这些信息是一样的,对比之下,还是传入一个参数要方便些。

基于上述分析,便可知道为什么C/C++的参数入栈顺序是从右向左了——如果是从左向右压栈,第一个参数(即描述可变参数表各变量类型的那个参数)将被放在栈底,由于可变参的函数第一步就需要解析可变参数表的各参数类型,即第一步就需要得到上述参数,因此,将它放在栈底是很不方便的。当然,从左向右压栈的话也可以实现可变参的功能,但是这样的话,该功能实现起来会复杂些。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值