【大一C语言】请问下面的“16”是如何算出来的?

 我来答
匿名用户
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++标准中的顺序点 的概念。。
魂政
2015-01-10 · 超过26用户采纳过TA的回答
知道答主
回答量:86
采纳率:0%
帮助的人:37.8万
展开全部
a++ 是先运算在相加 所以 (a++)+(a++)+(a++) = 6 但是a = 5了 而++b是先相加再运算 所以(++b)+(++b)+(++b) = 4 + 5 +6 = 15 b= 6 不知道你的为什么是16
追问
可是这是我用VC++6.0打出来的诶,怎么会错呢?
追答
这个就不太清楚了哦!你换成VS编译看看
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式