5 运算结果: int main() { int x=1; printf(“%d,%d,%d\n”, x+=10,x=16,x++); } 20
展开全部
这如果是一个考试题目,则是一个钻牛角尖的题目。
这实际上是考函数的参数入栈顺序。
但是该顺序和具体编译器实现相关,并无一定。
因为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个,又不是。
这个只能记忆,,,,在实际写程序中,尽量避免这样使用
取参数,从右往左——但第1个和第2个,又不是。
这个只能记忆,,,,在实际写程序中,尽量避免这样使用
追问
是楼上说的入栈的问题吗。。。。
追答
那是一般的情况,,,,,中间的x=16特殊。。。。
VC2015 编译结果是
26 26 1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |