鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: paomaliuju

大家帮忙看看这道题的答案是多少,++i的问题

[复制链接]
发表于 2014-7-24 10:49:41 | 显示全部楼层
paomaliuju 发表于 2014-7-14 14:57
经查证,得出如下结论:
源代码:
为了证实自己的理解,多做了几个测试

你的结论全部都是错的 没有一点价值 通篇误人子弟
看法就是 先去弄明白什么叫做C语言未定义行为
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 10:55:46 | 显示全部楼层
我是师兄 发表于 2014-7-24 10:49
你的结论全部都是错的 没有一点价值 通篇误人子弟
看法就是 先去弄明白什么叫做C语言未定义行为

首先,我已经说明我不是啥大牛,新手一个,得出的结论只是个人揣测!
其次,我没有认为我的结论一定就是对的,我是猜测,只是因为我的猜测和程序运行结果高度吻合,所以我认为应该是对的;
再者,没有大牛出来解释到底是怎么回事,所以,我就坚持这种理解;
最后,你既然否定结论,请证明你是对的,我很期待你的解释,希望你能够给新人一个权威正确的答案!
注:我最不喜欢哪些只有否定,没有实质性指导的建议或意见!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 10:59:15 | 显示全部楼层
paomaliuju 发表于 2014-7-24 10:55
首先,我已经说明我不是啥大牛,新手一个,得出的结论只是个人揣测!
其次,我没有认为我的结论一定就是 ...

你说你讨厌只否定 而不给出建议指导
那么 别人给了你建议指导 你是否有去实践 ?
没去实践 那么我退后一百步 你有没有看到别人的建议指导?
你没看到?
我把建议摆得端端正正了 你看都不看 怪我咯?

有没有让你全弄明白什么叫做未定义行为?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 11:08:55 | 显示全部楼层
paomaliuju 发表于 2014-7-24 10:55
首先,我已经说明我不是啥大牛,新手一个,得出的结论只是个人揣测!
其次,我没有认为我的结论一定就是 ...

缩放1.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 11:09:24 | 显示全部楼层
我是师兄 发表于 2014-7-24 10:59
你说你讨厌只否定 而不给出建议指导
那么 别人给了你建议指导 你是否有去实践 ?
没去实践 那么我退后 ...

虽然,对你的说法,内心是有点不服,但还是要谢谢你:lol:
了解了下关于c语言未定义行为,结合此题目,看到下面一文章
http://blog.csdn.net/sevenmit/article/details/8227990
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 20:53:24 | 显示全部楼层
本帖最后由 Nightnjl 于 2014-7-24 21:00 编辑

先运算++再计算用变量撒。

你分开来看不就好了
i++;//这里你要换成++i也无所谓撒。
i++;
s=i+i

看了一下你的测试就再说下吧。
他的意思是先自增再使用。前提是你要用到++i的时候,
你(++i)+(++i)+(++i)按自增运算的意思是前两个先用,所以先做自增再计算,计算完了要跟下一个++i求和的时候再自增,而不是一次将3个++i都计算掉。其实自增的说明里已经说的很清楚了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 21:19:42 | 显示全部楼层
引用的是你的连接的汇编代码

4:       int i = 6;
00401028   mov         dword ptr [ebp-4],6    //先将6压到栈中,相当于给i赋值为6,栈地址为
[ebp-4],简单的理解就是[ebp-4]=i
5:       int k = (++i) + (++i) + (++i);
0040102F   mov         eax,dword ptr [ebp-4] //将
[ebp-4]里的值传给eax,也就是eax=6
00401032   add         eax,1                               //add加法运算,也就是自增1 结果是eax=7
00401035   mov         dword ptr [ebp-4],eax  //将eax=7的值继续压到栈中的
[ebp-4] 地址里
00401038   mov         ecx,dword ptr [ebp-4]  //将
[ebp-4] 里的值传给ecx.结果ecx=7
0040103B   add         ecx,1                             //自增运算ecx=8
0040103E   mov         dword ptr [ebp-4],ecx //将ecx=8压入栈,地址还是
[ebp-4] //到这里相当于计算了前两个++i,这个时候i的值已经变成8
00401041   mov         edx,dword ptr [ebp-4]  //这里是将
[ebp-4] 中的值传递给edx,相当于edx=8
00401044   add         edx,dword ptr [ebp-4] ; //这个地方相当于edx=edx+
[ebp-4]  ,也就是edx=8+8=16.到此为止就相当于计算 (++i) + (++i)
00401047   mov         eax,dword ptr [ebp-4] ; 再次将i的值赋值给eax
0040104A   add         eax,1                             ;  eax自增1  eax = 9
0040104D   mov         dword ptr [ebp-4],eax ;//将寄存器eax中的数字继续放回栈中。
00401050   add         edx,dword ptr [ebp-4]  ;  /相当于edx=edx+
[ebp-4].初始edx=16 [ebp-4]=9,结果edx=25
00401053   mov         dword ptr [ebp-8],edx ;  edx -> k  所以,k = 25


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 21:32:55 | 显示全部楼层
这种代码不仅为难别人还为难自己,可读性很重要啊。程序员又不是艺术家,写这么diao干嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-25 10:09:14 | 显示全部楼层
Nightnjl 发表于 2014-7-24 21:19
引用的是你的连接的汇编代码

4:       int i = 6;

谢谢您,受教了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-25 10:12:31 | 显示全部楼层
幼龙 发表于 2014-7-24 21:32
这种代码不仅为难别人还为难自己,可读性很重要啊。程序员又不是艺术家,写这么diao干嘛

是的,正常写软件的时候,肯定不这么用,但事实是,遇到了这个问题,并且计算机给出了这样的答案,我只是想知道:为什么我的计算机(xp+vc++6.0)会得出这样的答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-25 14:17:32 | 显示全部楼层
自己看下汇编吧,调试的时候,按alt + 8
自己分析一下,我对汇编不太熟悉
QQ图片20140725141653.jpg
QQ图片20140725141811.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表