我是师兄 发表于 2014-7-24 10:49:41

paomaliuju 发表于 2014-7-14 14:57
经查证,得出如下结论:
源代码:
为了证实自己的理解,多做了几个测试


你的结论全部都是错的 没有一点价值 通篇误人子弟
看法就是 先去弄明白什么叫做C语言未定义行为

paomaliuju 发表于 2014-7-24 10:55:46

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

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

我是师兄 发表于 2014-7-24 10:59:15

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

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

有没有让你全弄明白什么叫做未定义行为?

我是师兄 发表于 2014-7-24 11:08:55

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



paomaliuju 发表于 2014-7-24 11:09:24

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

虽然,对你的说法,内心是有点不服,但还是要谢谢你:lol:
了解了下关于c语言未定义行为,结合此题目,看到下面一文章
http://blog.csdn.net/sevenmit/article/details/8227990

Nightnjl 发表于 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都计算掉。其实自增的说明里已经说的很清楚了。

Nightnjl 发表于 2014-7-24 21:19:42

引用的是你的连接的汇编代码

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

幼龙 发表于 2014-7-24 21:32:55

这种代码不仅为难别人还为难自己,可读性很重要啊。程序员又不是艺术家,写这么diao干嘛

paomaliuju 发表于 2014-7-25 10:09:14

Nightnjl 发表于 2014-7-24 21:19
引用的是你的连接的汇编代码

4:       int i = 6;


谢谢您,受教了!

paomaliuju 发表于 2014-7-25 10:12:31

幼龙 发表于 2014-7-24 21:32
这种代码不仅为难别人还为难自己,可读性很重要啊。程序员又不是艺术家,写这么diao干嘛

是的,正常写软件的时候,肯定不这么用,但事实是,遇到了这个问题,并且计算机给出了这样的答案,我只是想知道:为什么我的计算机(xp+vc++6.0)会得出这样的答案?

戏++ 发表于 2014-7-25 14:17:32

自己看下汇编吧,调试的时候,按alt + 8
自己分析一下,我对汇编不太熟悉
页: 1 [2]
查看完整版本: 大家帮忙看看这道题的答案是多少,++i的问题