【大一C语言】请问下面的“16”是如何算出来的?
2个回答
2015-01-10
展开全部
这种问题不值得深究的,因为C/C++在实际的工作中写源码时,切记 一个变量在一个表达式中被修改多次。 看你的截图是vc6.0,你debug版结果是16,你release版就是18了。。要深究其问题,可以从反汇编角度理解。。但是以后记得,这种代码不要写,一个变量在一个表达式中尽量不要被修改两次。
//debug版的反汇编代码:
9: printf("%d\n", (++b) + (++b) + (++b)); //这是源码
00401023 mov eax,dword ptr [b] //b的值保存到eax寄存器
00401026 add eax,1 //给eax增加1 ,这时eax是4
00401029 mov dword ptr [b],eax //eax=4保存到变量b中,这时b是4
0040102C mov ecx,dword ptr [b] //这里把b保存到ecx中,ecx=4
0040102F add ecx,1 //这里ecx+1 所以,ecx=5
00401032 mov dword ptr [b],ecx //把ecx保存到变量b中,b现在是5
00401035 mov edx,dword ptr [b] //把变量b保存到edx
00401038 add edx,dword ptr [b] //就是5+5 edx =10
0040103B mov eax,dword ptr [b] // eax=5
0040103E add eax,1 //eax=6
00401041 mov dword ptr [b],eax //注意这时候b的值变成6了
00401044 add edx,dword ptr [b] //让6和原来edx的值10相加 所以结果就是16了
00401047 mov esi,esp
00401049 push edx //这里是printf函数的参数入栈。。
0040104A push offset ___xi_z+104h (00404410)
0040104F call dword ptr [__imp__printf (004050a4)]
00401055 add esp,8
00401058 cmp esi,esp
0040105A call _chkesp (0040108e)
你生成release版就不一样了。。。
追问
也就是说这道题的答案是15哦?
追答
没有答案啊,你debug版是16,release版是18 这样的问题应该避免的,现在的教育真是很蛋疼啊 如果你要深入的理解这个问题,建议理解一下 数据结构 的栈,那一节一般会有表达式如何入栈,还有一个参考一下 C/C++标准中的顺序点 的概念。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询