经查证,得出如下结论:
源代码:
为了证实自己的理解,多做了几个测试
你的结论全部都是错的 没有一点价值 通篇误人子弟
看法就是 先去弄明白什么叫做C语言未定义行为
我是师兄 发表于 2014-7-24 10:49
你的结论全部都是错的 没有一点价值 通篇误人子弟
看法就是 先去弄明白什么叫做C语言未定义行为
首先,我已经说明我不是啥大牛,新手一个,得出的结论只是个人揣测!
其次,我没有认为我的结论一定就是对的,我是猜测,只是因为我的猜测和程序运行结果高度吻合,所以我认为应该是对的;
再者,没有大牛出来解释到底是怎么回事,所以,我就坚持这种理解;
最后,你既然否定结论,请证明你是对的,我很期待你的解释,希望你能够给新人一个权威正确的答案!
注:我最不喜欢哪些只有否定,没有实质性指导的建议或意见! paomaliuju 发表于 2014-7-24 10:55
首先,我已经说明我不是啥大牛,新手一个,得出的结论只是个人揣测!
其次,我没有认为我的结论一定就是 ...
你说你讨厌只否定 而不给出建议指导
那么 别人给了你建议指导 你是否有去实践 ?
没去实践 那么我退后一百步 你有没有看到别人的建议指导?
你没看到?
我把建议摆得端端正正了 你看都不看 怪我咯?
有没有让你全弄明白什么叫做未定义行为? paomaliuju 发表于 2014-7-24 10:55
首先,我已经说明我不是啥大牛,新手一个,得出的结论只是个人揣测!
其次,我没有认为我的结论一定就是 ...
我是师兄 发表于 2014-7-24 10:59
你说你讨厌只否定 而不给出建议指导
那么 别人给了你建议指导 你是否有去实践 ?
没去实践 那么我退后 ...
虽然,对你的说法,内心是有点不服,但还是要谢谢你:lol:
了解了下关于c语言未定义行为,结合此题目,看到下面一文章
http://blog.csdn.net/sevenmit/article/details/8227990 本帖最后由 Nightnjl 于 2014-7-24 21:00 编辑
先运算++再计算用变量撒。
你分开来看不就好了
i++;//这里你要换成++i也无所谓撒。
i++;
s=i+i
看了一下你的测试就再说下吧。
他的意思是先自增再使用。前提是你要用到++i的时候,
你(++i)+(++i)+(++i)按自增运算的意思是前两个先用,所以先做自增再计算,计算完了要跟下一个++i求和的时候再自增,而不是一次将3个++i都计算掉。其实自增的说明里已经说的很清楚了。
引用的是你的连接的汇编代码
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
这种代码不仅为难别人还为难自己,可读性很重要啊。程序员又不是艺术家,写这么diao干嘛 Nightnjl 发表于 2014-7-24 21:19
引用的是你的连接的汇编代码
4: int i = 6;
谢谢您,受教了! 幼龙 发表于 2014-7-24 21:32
这种代码不仅为难别人还为难自己,可读性很重要啊。程序员又不是艺术家,写这么diao干嘛
是的,正常写软件的时候,肯定不这么用,但事实是,遇到了这个问题,并且计算机给出了这样的答案,我只是想知道:为什么我的计算机(xp+vc++6.0)会得出这样的答案? 自己看下汇编吧,调试的时候,按alt + 8
自己分析一下,我对汇编不太熟悉
页:
1
[2]