免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 21160 | 回复: 35
打印 上一主题 下一主题

[C] C语言函数参数压栈顺序与求值顺序的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-04 08:36 |只看该作者 |倒序浏览
我记得好像看到某个文章里面说C语言里面的函数参数压栈顺序与求值顺序是两回事。 压栈顺序是从右到左,而求值顺序则是undefined的,由编译器实现决定,例如

  1. int g();
  2. int h();
  3. int f(int c, int b);
  4. ...
  5. f(g(), h());         --(1)
  6. ...
复制代码

(1)处f函数调用,先计算顺序g,还是先计算h这个由编译器决定。而参数的压栈则是固定的由右到左,现将h的结果压栈,然后g的结果压栈。

因为手上没有什么编译器,不太好测试。所以想直接在这里发个帖子问问。

论坛徽章:
0
2 [报告]
发表于 2006-04-05 09:56 |只看该作者
up
别沉了

论坛徽章:
0
3 [报告]
发表于 2006-04-05 10:18 |只看该作者
压栈不是一个 c语言概念
求值次序是不确定的

论坛徽章:
0
4 [报告]
发表于 2006-04-06 14:21 |只看该作者
原帖由 angelanpan 于 2006-4-4 08:36 发表
我记得好像看到某个文章里面说C语言里面的函数参数压栈顺序与求值顺序是两回事。 压栈顺序是从右到左,而求值顺序则是undefined的,由编译器实现决定,例如
[code]
int g();
int h();
int f(int c, int b);
...


参数的求值顺序与具体的编译器有关,是不定的。

论坛徽章:
0
5 [报告]
发表于 2006-04-06 14:26 |只看该作者
楼主说的完全正确

C语言那样的参数压栈比较适合不定参数的实现,也就是比如 f(int ,float, ...)
如果考虑效率,也可以用用pascal方式(它的压栈循序与c的相反)

求值的循序如果对程序有影响的话,也不用去关心程序的实现是从左到右还是从右到左,而应在调用函数之前确定好;
例:
a=g();
b=h();
f(a,b);

[ 本帖最后由 luojiannx 于 2006-4-6 14:29 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-05-16 17:00 |只看该作者
哈, Google给搜索到CU的老贴.

1) 确实是这样子,即使是同样的gcc版本,在Sparc上和在X86上就使用了不同的计算顺序,这个还没到压栈那一步呢
    Sparc是按照从左向右的Natrual order,而在X86上就正好反过来,我试了Sparc的gcc 2.95.2和X86, Fedora的gcc 2.95.2 与 gcc 4.4 ; 还好都是AT&T 风格的ASM, 否则看Intel的那个, 左右是反的...

2) 为什么要这样实现? 同一个gcc的 release为什么会针对不同平台做不同的处理顺序呢?

3) 为什么从左到右就压栈会比较有效率? 就是Pascal压栈模式?

4) gcc是否有调整参数可以去选择某种顺序?

2,3,4正在研究中, 欢迎大家指点..

论坛徽章:
0
7 [报告]
发表于 2009-05-16 17:26 |只看该作者

回复 #6 maxwu 的帖子

从某种意义上讲,C 语言不是高级语言,因为它具备许多高级语言无法完成的功能,就比如直接内存访问。

为了使 C 语言具有更大的灵活性,标准在一些实现细节上并没有作太多的规定,而是留给实现者来完成。

不同的平台使用不同的调用约定(calling conventions),GCC 是一套跨平台的编译系统,自然也遵守这些约定。

论坛徽章:
0
8 [报告]
发表于 2009-05-16 19:00 |只看该作者
langue , Thanks!

关于Calling Convention,能不能帮忙提供一些Tips? 我来Study一下看有没有办法从Makefile的角度来让Code不依赖于具体的Convention就可以cross_platform.

论坛徽章:
0
9 [报告]
发表于 2009-05-16 20:57 |只看该作者
原帖由 langue 于 2009-5-16 17:26 发表
从某种意义上讲,C 语言不是高级语言,因为它具备许多高级语言无法完成的功能,就比如直接内存访问。
...

1)C不能直接访问内存?
某些C不能,与语言无关,是虚存的问题。因为几乎所有的单片机C都能直接访问内存,DOS的C也行。
2)其它高级语言都能直接访问内存?
好像还是不行的多。

论坛徽章:
0
10 [报告]
发表于 2009-05-16 20:58 |只看该作者
原帖由 luojiannx 于 2006-4-6 14:26 发表
楼主说的完全正确

C语言那样的参数压栈比较适合不定参数的实现,也就是比如 f(int ,float, ...)
如果考虑效率,也可以用用pascal方式(它的压栈循序与c的相反)

求值的循序如果对程序有影响的话,也不用 ...

忘了在哪里看见过,是这种说法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP