LeoDemon 发表于 2014-8-28 09:27:53

HB无影 发表于 2014-8-27 12:47
通过上面的反汇编可以很清楚的看到!!!

n=(i++)*(i++);
---how about this?

1012662902 发表于 2014-8-28 16:07:53

还是多注重算法和提高思想吧   当码农总归不是个长久的职业

1123566890 发表于 2014-8-28 18:05:32

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

你说的很对,但是如果新手的问题没一个人回答 还有谁愿意来我们论坛,来这问问题说明 他们相信我们论坛 相信我们能帮助他们解决问题。

放鸟的笼子 发表于 2014-8-28 20:12:26

编译器在最后乘法运算的时候调用的是同一个内存地址(X),所以是9

LeoDemon 发表于 2014-8-29 13:56:46

HB无影 发表于 2014-8-28 17:16
我懂!你是说我这样很无聊!小事化大啊

额。。不是,我是想问这个用反编译会是什么效果?

ling0 发表于 2014-8-29 14:04:42

LeoDemon 发表于 2014-8-28 09:27
n=(i++)*(i++);
---how about this?

一样是9

longtian 发表于 2014-8-29 16:13:08

一楼是正解,但是根本原因是符号的优先级,括号的优先级最高,所以从括号中开始算(百度百科运算符的优先级)),又因为++运算方向是从右至左,则先计算++x,进行两次运算(因为有两个括号),以结果为乘数,第一次自增为2,第二次为3,3*3=9;再说说++,若改为(x++)*(x++),结果就不一样了,是1,为什么,刚才提到++运算的方向,从右至左,这种情况下类似(临时变量=x++)*(临时变量=a++),临时变量*临时变量,先进行赋值临时变量=a(因为=号,变量a再自增,再将临时变量做运算

爆破2014 发表于 2014-8-30 00:56:08

y=(++x)*(++x);       等价于
x++;
x++;
y=x*x;
++x或x++多的时候 编译器会优化 所以别管这个了 真想了解 去学点汇编然后 debug 看看汇编代码就知道了

牡丹花下死做鬼 发表于 2014-8-30 10:27:56

这个不一定的得看编译器的

Mr.郭 发表于 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;三条语句的执行结果

低调哥 发表于 2014-8-31 07:54:21

这个涉及到运算符的优先级问题,自增运算符比乘号跟高级,所以优先执行自增,再执行乘法运算。

selectyjc 发表于 2014-8-31 10:08:39

编译器的问题,这是要看编译器的编译习惯的

ゃ莼处狼性ぉ 发表于 2014-8-31 11:09:24

支持楼主!加油

Thomas_mq 发表于 2014-8-31 11:44:29

一楼正解   楼主要加强基础学习啊

郭兴华1 发表于 2014-8-31 12:48:37

强烈支持楼主ing……

寂寞的行者4455 发表于 2014-8-31 15:43:02

这种代码在实际工作中是不可能出现的

心灵聆听 发表于 2014-8-31 20:00:06

为什么老是要在这类问题上纠结。。++?还是?++有意思吗?用()代替不好吗?

风之残月 发表于 2014-8-31 21:03:09

我把这段代码反汇编了一下,旁边每一句写了注释
18:       intx=1,y,z;
00401028   mov         dword ptr ,1                        // x = 1
19:       y=(++x)*(++x);
0040102F   mov         eax,dword ptr                 // eax = x = 1
00401032   add         eax,1                                                // ++eax = 2
00401035   mov         dword ptr ,eax                // x = eax = 2
00401038   mov         ecx,dword ptr                 // ecx = x = 2
0040103B   add         ecx,1                                                // ++ecx = 3
0040103E   mov         dword ptr ,ecx                // x = ecx = 3
00401041   mov         edx,dword ptr                 // edx = x = 3
00401044   imul      edx,dword ptr                         // edx = x * edx = 3 * 3 = 9
00401048   mov         dword ptr ,edx                // y = edx = 9
20:       printf("%d",y);
0040104B   mov         eax,dword ptr                 // print 9

意思就是 先计算 ++x 得到x = 2,然后 ++x 得到 x = 3,最后 3 * 3 = 9

儁破孩@123 发表于 2014-8-31 21:10:32

又学到新知识了,好爽{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}

verilog123 发表于 2014-9-1 10:01:55

这个是和编译器有关系的,没有必要去纠结这个问题,真正写程序时,依据平台定夺就行
页: 1 [2] 3
查看完整版本: 被妹子问倒了