菜鸟求救!!!!!!!!!!!!+++++急!!!!!!

zfl0833 2005-05-21 04:21:19
请问各位前辈 在c 语言 及 vc++ 和c++ builder 中如何解释以下程序的执行过程;
main ()
{
int n=1;
printf("%d,%d",n++,n++);
}
以上是在c语言下的代码, 请各位高手能不能帮我解释一下在c语言中,为什么结果为2,1
在vc++ 和 c ++ builder中结果又会怎样? 怎么样分析?
...全文
178 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
soft_2008 2005-05-25
  • 打赏
  • 举报
回复
mark
cppprogramlover 2005-05-24
  • 打赏
  • 举报
回复
不要深究,还不如看看printf的实现。
cppprogramlover 2005-05-24
  • 打赏
  • 举报
回复
标准c不是 __cdecl吗,从右压栈
难道我记错了?
cppprogramlover 2005-05-24
  • 打赏
  • 举报
回复
有道理,如果 已知的那个参数在后面,就要左到右压栈了
jishuixyj1985 2005-05-24
  • 打赏
  • 举报
回复
因为printf()函数的数据流都是压入堆栈,在打印的,所以是从右到左啊~~
whyglinux 2005-05-24
  • 打赏
  • 举报
回复
To cppprogramlover(爱相随—)
>> 标准c不是 __cdecl吗,从右压栈

默认设置是这样。但是默认设置是可以改变的。

To jingyueid(干宁)

既然printf()的压栈顺序是固定的,那就更支持了我的观点。
jingyueid 2005-05-24
  • 打赏
  • 举报
回复
T:zhangfjj(小张(正在学习Linux。。。))
whyglinux(山青水秀) ( )

用压栈顺序来解释是不全面的。比如,无法解释结果是1,1(VC6中的结果)的情况。

zhangfjj(小张(正在学习Linux。。。)) 的解释是正确的,即标准没有规定函数参数的求值顺序,因此上述函数的行为是无定义的。

============================================================================

C标准是如何制定的我不清楚,但这里(变参函数)必须是采用反向压湛的顺序来完成操作。因为在汇编级代码无法知道具体有多少个参数,只有通过反向压栈的方法才能获得第一个参数,然后再得到以后的参数列表。这也就是为什么PASICAL不支持变参的原因。同样C/C++做的DLL也不用变参接口,防止VB等程序不能调用。

因此对于%s%d,这些字符都已经标志出类参数类型的尺寸信息。
whyglinux 2005-05-23
  • 打赏
  • 举报
回复
用压栈顺序来解释是不全面的。比如,无法解释结果是1,1(VC6中的结果)的情况。

zhangfjj(小张(正在学习Linux。。。)) 的解释是正确的,即标准没有规定函数参数的求值顺序,因此上述函数的行为是无定义的。
lucymary1982 2005-05-23
  • 打赏
  • 举报
回复
结果是1,1
snailcl 2005-05-23
  • 打赏
  • 举报
回复
这个在c语言的书上肯定有讲啊,lbing7和goodboy1881的解释都可以
flyarry 2005-05-21
  • 打赏
  • 举报
回复
呵呵 又来这种问题了,以前看大虾们回答得多了.
printf("%d,%d",n++,n++); 先计算右边的n++,然后再算左边的,所以就是2,1了.
不知道我说的有没有错?
lbing7 2005-05-21
  • 打赏
  • 举报
回复
我觉得三井给出了合理的低层解释

我是按老师给我讲的

55555555555555555555555
谢谢过三井
zhangfjj 2005-05-21
  • 打赏
  • 举报
回复
函数对实参表达式的求值顺序的问题,标准C并未做出规定。
不过大多数编译器都是从右到左的顺序来进行求值的。
sunman1982 2005-05-21
  • 打赏
  • 举报
回复
同问 呵呵 不解
lbing7 2005-05-21
  • 打赏
  • 举报
回复
printf("%d,%d",n++,n++);

printf();里面的求值顺序是自右向左
printf("%d,%d",n++(2),n++(1));
一:做表达式(1)将n=1的值作为表达式的值,然后算n++,此时n==2
二:做表达式(2)将2作为表达式的值,然后做n++,此时n==3
三:按格式打印出来!也就是:2,1
积木 2005-05-21
  • 打赏
  • 举报
回复
解释比较简单,就是函数参数压栈的问题,C语言中,函数参数有从左向右压栈和从右向左压栈两种顺序,你看到的就是从右向左压栈,这样,在出栈的时候,最左面的参数最先出栈。嗯
所以就是n进栈,就是1,然后n++ ,然后n再进栈就是2,自然就是你看到的结果了,
你只要在不同的编译器下面都尝试一下就可以了,不需要深究。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧