++运算符真难
附近图片中的内容为什么讲义上说的答案和我实际算出来的不一样呢?
本帖最后由 福禄娃娃 于 2013-10-6 22:04 编辑
编译器不同,具体差距看反汇编结果
你的为 p = 5 +5 +5 =15i用完再自增为8
q= 7+ 7+ 8 =22j先自增两次,前两项然后相加,j再自增一次,第三项和前面的值相加。j为8 福禄娃娃 发表于 2013-10-6 22:02 static/image/common/back.gif
编译器不同,具体差距看反汇编结果
你的为 p = 5 +5 +5 =15i用完再自增为8
q= 7+ 7+ 8 =22j先自增两次 ...
具体编译器的运算规则,怎么才能知道呢? 本帖最后由 福禄娃娃 于 2013-10-6 22:31 编辑
DragonL915 发表于 2013-10-6 22:10 static/image/common/back.gif
具体编译器的运算规则,怎么才能知道呢?
基本按照顺序点和副作用这两个规则来,如果有差异的话可能是编译器优化、不同处理的过程
反汇编过来就知道了
在VC或者VS中F9下个断点,然后F5调试,Alt+8查看反汇编代码
下面是反汇编代码5: int i = 5,j = 5,p = 0,q = 0;
00401028 mov dword ptr ,5
0040102F mov dword ptr ,5
00401036 mov dword ptr ,0
0040103D mov dword ptr ,0
6: p = (i++) + (i++) + (i++);
00401044 mov eax,dword ptr
00401047 add eax,dword ptr
0040104A add eax,dword ptr
0040104D mov dword ptr ,eax
00401050 mov ecx,dword ptr
00401053 add ecx,1
00401056 mov dword ptr ,ecx
00401059 mov edx,dword ptr
0040105C add edx,1
0040105F mov dword ptr ,edx
00401062 mov eax,dword ptr
00401065 add eax,1
00401068 mov dword ptr ,eax
7: q = (++j) + (++j) + (++j);
0040106B mov ecx,dword ptr
0040106E add ecx,1
00401071 mov dword ptr ,ecx
00401074 mov edx,dword ptr
00401077 add edx,1
0040107A mov dword ptr ,edx
0040107D mov eax,dword ptr
00401080 add eax,dword ptr
00401083 mov ecx,dword ptr
00401086 add ecx,1
00401089 mov dword ptr ,ecx
0040108C add eax,dword ptr
0040108F mov dword ptr ,eax
额 学习了算是 你反汇编看下吧 编译器不同结果是会不同的
顺便说下这个除了考试基本上没别的用处 真的不用纠结 具体的福禄已经说了我就不多说
我只想说 把精力放到该纠结的地方去 刚开始没必要系摩纳哥这个东西的 福禄娃娃 发表于 2013-10-6 22:14 static/image/common/back.gif
基本按照顺序点和副作用这两个规则来,如果有差异的话可能是编译器优化、不同处理的过程
反汇编过来就知 ...
MARK一下,等以后学到反编译了再回过头来看看,谢谢大神{:5_106:} DragonL915 发表于 2013-10-7 20:58 static/image/common/back.gif
MARK一下,等以后学到反编译了再回过头来看看,谢谢大神
大神倒不是,也许这点是我刚好会的。
一起进步、学习 学习一下子 反汇编吧,可能编译器不一样{:1_1:}{:1_1:}{:1_1:} 这个以前我也纠结过,看到楼上的解说,非常到位,{:1_1:}
页:
[1]