|
发表于 2020-4-3 22:24:07
|
显示全部楼层
江苏省苏州市
我跟你说,研究这种++和--并没有多大的意义,在不同的编译器下,得出的结果会有不同的
你要一定要搞明白为啥是这几个值,我建议你断点,然后通过查看汇编代码,逐一分析
- 14: int i = 8;
- 00C11988 C7 45 F8 08 00 00 00 mov dword ptr [ebp-8],8
- 15:
- 16: printf("++i=%d\n", ++i);
- 00C1198F 8B 45 F8 mov eax,dword ptr [ebp-8]
- 00C11992 83 C0 01 add eax,1
- 00C11995 89 45 F8 mov dword ptr [ebp-8],eax
- 00C11998 8B 4D F8 mov ecx,dword ptr [ebp-8]
- 00C1199B 51 push ecx
- 00C1199C 68 68 9B C1 00 push 0C19B68h
- 00C119A1 E8 AF F6 FF FF call 00C11055
- 00C119A6 83 C4 08 add esp,8
- 17: printf("--i=%d\n", --i);
- 00C119A9 8B 45 F8 mov eax,dword ptr [ebp-8]
- 00C119AC 83 E8 01 sub eax,1
- 00C119AF 89 45 F8 mov dword ptr [ebp-8],eax
- 00C119B2 8B 4D F8 mov ecx,dword ptr [ebp-8]
- 00C119B5 51 push ecx
- 00C119B6 68 30 9B C1 00 push 0C19B30h
- 00C119BB E8 95 F6 FF FF call 00C11055
- 00C119C0 83 C4 08 add esp,8
- 18: printf("i++=%d\n", i++);
- 00C119C3 8B 45 F8 mov eax,dword ptr [ebp-8]
- 00C119C6 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax
- 00C119CC 8B 4D F8 mov ecx,dword ptr [ebp-8]
- 00C119CF 83 C1 01 add ecx,1
- 00C119D2 89 4D F8 mov dword ptr [ebp-8],ecx
- 00C119D5 8B 95 30 FF FF FF mov edx,dword ptr [ebp+FFFFFF30h]
- 00C119DB 52 push edx
- 00C119DC 68 78 9B C1 00 push 0C19B78h
- 00C119E1 E8 6F F6 FF FF call 00C11055
- 00C119E6 83 C4 08 add esp,8
- 19: printf("i--=%d\n", i--);
- 00C119E9 8B 45 F8 mov eax,dword ptr [ebp-8]
- 19: printf("i--=%d\n", i--);
- 00C119EC 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax
- 00C119F2 8B 4D F8 mov ecx,dword ptr [ebp-8]
- 00C119F5 83 E9 01 sub ecx,1
- 00C119F8 89 4D F8 mov dword ptr [ebp-8],ecx
- 00C119FB 8B 95 30 FF FF FF mov edx,dword ptr [ebp+FFFFFF30h]
- 00C11A01 52 push edx
- 00C11A02 68 3C 9B C1 00 push 0C19B3Ch
- 00C11A07 E8 49 F6 FF FF call 00C11055
- 00C11A0C 83 C4 08 add esp,8
- 20: printf("-i++=%d\n", -i++);
- 00C11A0F 8B 45 F8 mov eax,dword ptr [ebp-8]
- 00C11A12 F7 D8 neg eax
- 00C11A14 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax
- 00C11A1A 8B 4D F8 mov ecx,dword ptr [ebp-8]
- 00C11A1D 83 C1 01 add ecx,1
- 00C11A20 89 4D F8 mov dword ptr [ebp-8],ecx
- 00C11A23 8B 95 30 FF FF FF mov edx,dword ptr [ebp+FFFFFF30h]
- 00C11A29 52 push edx
- 00C11A2A 68 38 9C C1 00 push 0C19C38h
- 00C11A2F E8 21 F6 FF FF call 00C11055
- 00C11A34 83 C4 08 add esp,8
- 21: printf("+i--=%d\n\n", +i--);
- 00C11A37 8B 45 F8 mov eax,dword ptr [ebp-8]
- 00C11A3A 89 85 30 FF FF FF mov dword ptr [ebp+FFFFFF30h],eax
- 00C11A40 8B 4D F8 mov ecx,dword ptr [ebp-8]
- 00C11A43 83 E9 01 sub ecx,1
- 00C11A46 89 4D F8 mov dword ptr [ebp-8],ecx
- 00C11A49 8B 95 30 FF FF FF mov edx,dword ptr [ebp+FFFFFF30h]
- 00C11A4F 52 push edx
- 00C11A50 68 4C 9B C1 00 push 0C19B4Ch
- 00C11A55 E8 FB F5 FF FF call 00C11055
- 00C11A5A 83 C4 08 add esp,8
- 22:
复制代码
其实前面几个都很好理解
就后面两个
-i++
和
+i--如何理解
其实你仔细看看反汇编的代码
你会发现
在执行
printf("-i++=%d\n", -i++);
首先,我们确认,在还没操作这个-i++时,i=8,如果你这个还不理解,那我也没法解释下去了
然后
编译器干了两件事情,
一个是-i结合,也就是-(8)传递给了printf函数,让它打印出-8
然后,执行i++,请问,i是多少?记住了,i=8,然后i=i+1=9,这个打印了吗?没有哟
printf("+i--=%d\n\n", +i--);
进入这个过程,请问在执行这个操作前的i值是多少?i=9哟
然后,你懂的编译器干了两件事情
一个是 +i,也就是+(9)传递给pirntf函数,打印
另一个 i--,i=8
不信,你打印下试试看,应该是为8,当前前提你得确保用的是vs2017(因为我用的是这个)vc6.0的我不敢保证还是这个数
|
|