5 运算结果: int main() { int x=1; printf(“%d,%d,%d\n”, x+=10,x=16,x++); } 20

求大神讲明白,想不明白... 求大神讲明白,想不明白 展开
 我来答
keyuth
2016-10-16 · TA获得超过825个赞
知道小有建树答主
回答量:215
采纳率:0%
帮助的人:86.1万
展开全部

这如果是一个考试题目,则是一个钻牛角尖的题目。

这实际上是考函数的参数入栈顺序。

但是该顺序和具体编译器实现相关,并无一定。

因为C语言支持可变长参数,所以它的函数参数入栈顺序为从右至左,最右边的参数在栈底,最左边的在栈顶。在函数内部,出栈顺序正好相反。

所以上述是从右往左计算,即先算x++(返回副本值1),再算x=16(返回16),最后是x+=10(返回26),最后输出:

26,16,1

参见调试代码:

9:        int x = 1;
00401028   mov         dword ptr [ebp-4],1
10:       printf( "% d, % d, % d\n", x += 10, x = 16, x++ );
0040102F   mov         eax,dword ptr [ebp-4]
00401032   mov         dword ptr [ebp-8],eax
00401035   mov         ecx,dword ptr [ebp-8]
00401038   push        ecx
00401039   mov         dword ptr [ebp-4],10h
00401040   mov         edx,dword ptr [ebp-4]
00401043   push        edx
00401044   mov         eax,dword ptr [ebp-4]
00401047   add         eax,0Ah
0040104A   mov         dword ptr [ebp-4],eax
0040104D   mov         ecx,dword ptr [ebp-4]
00401050   push        ecx
00401051   push        offset string "% d, % d, % d\n" (0042501c)
00401056   mov         edx,dword ptr [ebp-4]
00401059   add         edx,1
0040105C   mov         dword ptr [ebp-4],edx
0040105F   call        printf (00401140)
00401064   add         esp,10h
11:     return 0;

但是,c++中函数调用约定__fastcall会改变这种顺序。所以尽量避免使用这种容易发生错误的写法。

更多追问追答
追问
我在linux环境下编译了    结果是26 26 1     为什么啊
追答
这个应该和编译器的实现机制有关,建议dump一下,上述调试代码来自于VC++6.0
匿名用户
2016-10-16
展开全部
26 26 1
取参数,从右往左——但第1个和第2个,又不是。

这个只能记忆,,,,在实际写程序中,尽量避免这样使用
追问
是楼上说的入栈的问题吗。。。。
追答
那是一般的情况,,,,,中间的x=16特殊。。。。

VC2015 编译结果是
26 26 1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式