免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

[C] printf参数入栈顺序和编译器相关,还是都是从右至左? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-11-01 08:13 |只看该作者
__cdecl __stdcall __pascal __fastcall
这些类型的函数的参数是从左至右吗?

论坛徽章:
0
22 [报告]
发表于 2007-11-01 08:52 |只看该作者
参考: http://bbs.chinaunix.net/viewthr ... amp;highlight=newzy


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int bar()
  4. {
  5.     return 20;
  6. }

  7. int main()
  8. {
  9.     int         len = 3;

  10.     printf("%d, %d\n", len=bar(), len);
  11.     return 0;
  12. }
复制代码


测试结果:
gcc 3.4.3, gcc 3.4.4 输出结果为: 20, 20
gcc 3.2.2 及以下输出结果为: 20, 3
VC++ 6.0 输出结果为: 20, 3

该程序在 windows, linux, cygwin (x86, arm, mips) 上均得到同上的结果.

结论:
我们应尽量避免假设函数入栈顺序是自右向左的, 并无畏的加以应用.
不管是编译器bug, 还是其它, 我们都要要考虑不同编译器/版本差异会引起的结果差异.
andytodd 该用户已被删除
23 [报告]
发表于 2007-11-01 09:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
24 [报告]
发表于 2007-11-01 09:40 |只看该作者
原帖由 bluesky_jxc 于 2007-11-1 01:11 发表

正是从右到左才能判断啊。。。。
你想,栈啊,先进后出啊,所以最左边一个参数最后一个进栈,第一个出栈,然后printf在自己的代码里面只要分析第一个pop出来的字符串不就知道了么。。
另外,不定参数也是这 ...

汗,大哥,没有关系的。取参数不是用的pop,是用的mov,入栈顺序不影响取参

论坛徽章:
0
25 [报告]
发表于 2007-11-01 10:04 |只看该作者
C语言都是从右向左入栈的。
Pascal语言是从左到右。

论坛徽章:
0
26 [报告]
发表于 2007-11-01 10:08 |只看该作者
原帖由 newzy 于 2007-11-1 08:52 发表
参考: http://bbs.chinaunix.net/viewthr ... amp;highlight=newzy


#include
#include

int bar()
{
    return 20;
}

int main()
{
    int         len = 3;

    printf("%d ...


不是因为入栈顺序变了,而是编译器优化的结果。

C语言的参数入栈顺序雷打不动。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
27 [报告]
发表于 2007-11-01 11:07 |只看该作者
原帖由 JohnBull 于 2007-11-1 10:08 发表


不是因为入栈顺序变了,而是编译器优化的结果。

C语言的参数入栈顺序雷打不动。


斑竹的意思是C语言下,参数的入栈顺序是和编译器无关的?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
28 [报告]
发表于 2007-11-01 11:16 |只看该作者
是不是参数入栈顺序和实参的求值顺序是不一致的?

论坛徽章:
0
29 [报告]
发表于 2007-11-01 11:16 |只看该作者
原帖由 Godbach 于 2007-11-1 11:07 发表


斑竹的意思是C语言下,参数的入栈顺序是和编译器无关的?

同问,什么地方对入栈顺序做了规定吗?

论坛徽章:
0
30 [报告]
发表于 2007-11-01 11:18 |只看该作者
原帖由 Godbach 于 2007-11-1 11:07 发表


斑竹的意思是C语言下,参数的入栈顺序是和编译器无关的?


是的,否则变参函数无法实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP