鱼C论坛

 找回密码
 立即注册
楼主: 唐柏tang

被妹子问倒了

[复制链接]
发表于 2014-8-28 09:27:53 | 显示全部楼层
HB无影 发表于 2014-8-27 12:47
通过上面的反汇编可以很清楚的看到!!!

n=(i++)*(i++);
---how about this?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-28 16:07:53 | 显示全部楼层
还是多注重算法和提高思想吧   当码农总归不是个长久的职业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-28 18:05:32 | 显示全部楼层
仰望天上的光 发表于 2014-8-26 20:18
这种每个星期至少有人问一次的问题又出现了。。。真心不明白为什么遇到问题总觉得世界上自己是第一个遇到这 ...

你说的很对,但是如果新手的问题没一个人回答 还有谁愿意来我们论坛,来这问问题说明 他们相信我们论坛 相信我们能帮助他们解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-28 20:12:26 | 显示全部楼层
编译器在最后乘法运算的时候调用的是同一个内存地址(X),所以是9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-29 13:56:46 | 显示全部楼层
HB无影 发表于 2014-8-28 17:16
我懂!你是说我这样很无聊!小事化大啊

额。。不是,我是想问这个用反编译会是什么效果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-29 14:04:42 | 显示全部楼层
LeoDemon 发表于 2014-8-28 09:27
n=(i++)*(i++);
---how about this?

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

使用道具 举报

发表于 2014-8-29 16:13:08 | 显示全部楼层
一楼是正解,但是根本原因是符号的优先级,括号的优先级最高,所以从括号中开始算(百度百科运算符的优先级)),又因为++运算方向是从右至左,则先计算++x,进行两次运算(因为有两个括号),以结果为乘数,第一次自增为2,第二次为3,3*3=9;再说说++,若改为(x++)*(x++),结果就不一样了,是1,为什么,刚才提到++运算的方向,从右至左,这种情况下类似(临时变量=x++)*(临时变量=a++),临时变量*临时变量,先进行赋值临时变量=a(因为=号,变量a再自增,再将临时变量做运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-30 00:56:08 | 显示全部楼层
y=(++x)*(++x);       等价于
x++;
x++;
y=x*x;
++x或x++多的时候 编译器会优化 所以别管这个了 真想了解 去学点汇编然后 debug 看看汇编代码就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-30 10:27:56 | 显示全部楼层
这个不一定的得看编译器的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-30 16:11:22 | 显示全部楼层
++X跟X++的根本区别在于,++X是先把X的内存区先+1,加完再执行语句;而X++则是先把语句执行完再把内存区的数值+1。而所谓语句则是“;”号为结尾的一个程序代码,你这里用了两个++X,所以就先把内存区的数值两次+1,在执行整个语句,所以你的Y=(++x)*(++x)等价于:x+=1;x+=1;y=x*x;三条语句的执行结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 07:54:21 | 显示全部楼层
这个涉及到运算符的优先级问题,自增运算符比乘号跟高级,所以优先执行自增,再执行乘法运算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 10:08:39 | 显示全部楼层
编译器的问题,这是要看编译器的编译习惯的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 11:09:24 | 显示全部楼层
支持楼主!加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 11:44:29 | 显示全部楼层
一楼正解   楼主要加强基础学习啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 12:48:37 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 15:43:02 | 显示全部楼层
这种代码在实际工作中是不可能出现的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 20:00:06 | 显示全部楼层
为什么老是要在这类问题上纠结。。++?还是?++有意思吗?用()代替不好吗?

评分

参与人数 1鱼币 -1 收起 理由
我是师兄 -1 加() 表达式没有任何变化 代码一样是错的

查看全部评分

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

使用道具 举报

发表于 2014-8-31 21:03:09 | 显示全部楼层
我把这段代码反汇编了一下,旁边每一句写了注释
18:       int  x=1,y,z;
00401028   mov         dword ptr [ebp-4],1                        // x = 1
19:       y=(++x)*(++x);
0040102F   mov         eax,dword ptr [ebp-4]                // eax = x = 1
00401032   add         eax,1                                                // ++eax = 2
00401035   mov         dword ptr [ebp-4],eax                // x = eax = 2
00401038   mov         ecx,dword ptr [ebp-4]                // ecx = x = 2
0040103B   add         ecx,1                                                // ++ecx = 3
0040103E   mov         dword ptr [ebp-4],ecx                // x = ecx = 3
00401041   mov         edx,dword ptr [ebp-4]                // edx = x = 3
00401044   imul        edx,dword ptr [ebp-4]                        // edx = x * edx = 3 * 3 = 9
00401048   mov         dword ptr [ebp-8],edx                // y = edx = 9
20:       printf("%d",y);
0040104B   mov         eax,dword ptr [ebp-8]                // print 9

意思就是 先计算 ++x 得到x = 2,然后 ++x 得到 x = 3,最后 3 * 3 = 9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 21:10:32 | 显示全部楼层
又学到新知识了,好爽{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-1 10:01:55 | 显示全部楼层
这个是和编译器有关系的,没有必要去纠结这个问题,真正写程序时,依据平台定夺就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 02:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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