HB无影 发表于 2014-8-27 12:47
通过上面的反汇编可以很清楚的看到!!!
n=(i++)*(i++);
---how about this?
还是多注重算法和提高思想吧 当码农总归不是个长久的职业
仰望天上的光 发表于 2014-8-26 20:18
这种每个星期至少有人问一次的问题又出现了。。。真心不明白为什么遇到问题总觉得世界上自己是第一个遇到这 ...
你说的很对,但是如果新手的问题没一个人回答 还有谁愿意来我们论坛,来这问问题说明 他们相信我们论坛 相信我们能帮助他们解决问题。
编译器在最后乘法运算的时候调用的是同一个内存地址(X),所以是9
HB无影 发表于 2014-8-28 17:16
我懂!你是说我这样很无聊!小事化大啊
额。。不是,我是想问这个用反编译会是什么效果?
LeoDemon 发表于 2014-8-28 09:27
n=(i++)*(i++);
---how about this?
一样是9
一楼是正解,但是根本原因是符号的优先级,括号的优先级最高,所以从括号中开始算(百度百科运算符的优先级)),又因为++运算方向是从右至左,则先计算++x,进行两次运算(因为有两个括号),以结果为乘数,第一次自增为2,第二次为3,3*3=9;再说说++,若改为(x++)*(x++),结果就不一样了,是1,为什么,刚才提到++运算的方向,从右至左,这种情况下类似(临时变量=x++)*(临时变量=a++),临时变量*临时变量,先进行赋值临时变量=a(因为=号,变量a再自增,再将临时变量做运算
y=(++x)*(++x); 等价于
x++;
x++;
y=x*x;
++x或x++多的时候 编译器会优化 所以别管这个了 真想了解 去学点汇编然后 debug 看看汇编代码就知道了
这个不一定的得看编译器的
++X跟X++的根本区别在于,++X是先把X的内存区先+1,加完再执行语句;而X++则是先把语句执行完再把内存区的数值+1。而所谓语句则是“;”号为结尾的一个程序代码,你这里用了两个++X,所以就先把内存区的数值两次+1,在执行整个语句,所以你的Y=(++x)*(++x)等价于:x+=1;x+=1;y=x*x;三条语句的执行结果
这个涉及到运算符的优先级问题,自增运算符比乘号跟高级,所以优先执行自增,再执行乘法运算。
编译器的问题,这是要看编译器的编译习惯的
支持楼主!加油
一楼正解 楼主要加强基础学习啊
强烈支持楼主ing……
这种代码在实际工作中是不可能出现的
为什么老是要在这类问题上纠结。。++?还是?++有意思吗?用()代替不好吗?
我把这段代码反汇编了一下,旁边每一句写了注释
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
又学到新知识了,好爽{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
这个是和编译器有关系的,没有必要去纠结这个问题,真正写程序时,依据平台定夺就行