我个人挺反感这种代码的 不知道为啥有人愿意研究这个。。
编译器咋理解都说不明白 有意思么
反汇编
00401028
|.
C745 FC 05000>MOV [LOCAL.a],5
0040102F
|.
C745 F8 00000>MOV [LOCAL.j],0
00401036
|.
8B45 FC
MOV EAX,[LOCAL.a]
00401039
|.
83C0 01
ADD EAX,1
0040103C
|.
8945 FC
MOV [LOCAL.a],EAX
0040103F
|.
8B4D FC
MOV ECX,[LOCAL.a]
00401042
|.
83C1 01
ADD ECX,1
00401045
|.
894D FC
MOV [LOCAL.a],ECX
00401048
|.
8B55 FC
MOV EDX,[LOCAL.a]
0040104B
|.
0355 FC
ADD EDX,[LOCAL.a]
0040104E
|.
8B45 FC
MOV EAX,[LOCAL.a]
00401051
|.
83C0 01
ADD EAX,1
00401054
|.
8945 FC
MOV [LOCAL.a],EAX
00401057
|.
0355 FC
ADD EDX,[LOCAL.a]
0040105A
|.
8955 F8
MOV [LOCAL.j],EDX
0040105D
|.
8B4D F8
MOV ECX,[LOCAL.j]
00401060
|.
51
PUSH ECX
; /<%d>
00401061
|.
68 1C204200
PUSH OFFSET aa.??_C@_03HMFC@?$CFd?6?$AA@ ; |format = "%d
"
00401066
|.
E8 35000000
CALL aa.printf
; \printf
主要代码
int main(int argc, char* argv[])
{
int a = 5, j = 0;
j = (++a)+(++a)+(++a);
printf("%d\n",j);
return 0;
}
可能大家看不懂我翻译一下 VC6的debug编译器这么理解
从左到右 有括号先算括号 则先算 (++a)+(++a)
肯定是 a+=1;a+=1; 然后把两个括号里的加起来 就是7+7=14 然后 哎呀 原来后面还有个 得 再加 a+=1;变8了 然后加起来 前面的已经算了 直接用 14+8=22
等于22 不信我传程序你们看。。
[
本帖最后由 zklhp 于 2012-2-20 21:44 编辑 ]