作者cole945 (躂躂..)
看板C_and_CPP
标题Re: [问题] printf 传相同变数运算的问题???
时间Mon Jul 24 04:14:46 2006
呃..我推文推的怪怪的
所以我还是用回的重讲一次 :X
首先先回答你的问题..
印出的值为何是依编译器而异..
C99 6.5.2.2 Function calls 第10点
与 C++03标准 5.2.2 Function call 第8点
都说呼叫时参数的演算顺序(order of evaluation)
是没有明定的(unspecified)但是在正真的呼叫发生前..
这些变数演算会先计算完成...
printf( "%d %d %d %d", ++i, ++i, ++i, i-- );
也就是说..只能确定在呼叫printf前..这些 ++i, i-- 会计算完毕..
可是他是由左而右还是由右而左没有固定的计算顺序..
然後我说的由右而左(right-to-left)丢参数讲的不够精确 :X
一般且言 C/C++ compiler 都是使用 cdecl 这个calling convention..
原因之一是因为 C/C++ 支援不定长度的参数..
而被呼叫的function不知道参数有多少个..
若right-to-left将参数push进stack..
那麽stack的最上方就是第一个参数..
这是因为 C/C++ 的特性使然..
若使用错误的calling convention呼叫程式会烂掉..
不过spec中似乎也没明言是不是一定要这样丢(??)这要请其他前辈解释...
然後关於calling convention 有篇文章
Intel x86 Function-call Conventions - Assembly View
http://www.unixwiz.net/techtips/win32-callconv-asm.html
蛮有意思的..可以看看...
关於其他calling convention可以参考wikipedia
http://en.wikipedia.org/wiki/Calling_convention
--
补充..我後半段讲的东西可能会让人混淆..
push的顺序和计算的顺序
没有直接关系..
只是用相同的顺序比较容易处理..
所以大部份的C/C++compiler也采用相同的顺序..
但spec并没有要求演算顺序为何..
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.138.145.145
1F:推 drkkimo:那请问就是合参数推入堆叠的顺序无关搂? THX:) 07/24 04:16
2F:推 cole945:没直接关系@.@" 07/24 04:20
3F:→ cole945:因为由右而左丢..所以compiler顺手由右而左计算吧 orz 07/24 04:22
4F:→ drkkimo:mm.. thx~ 07/24 04:24
※ 编辑: cole945 来自: 220.139.137.172 (07/24 16:28)