#include <stdio.h>
int main(){
int a,b;
a = 4;
a += (a++);
printf("%d\n",a);//9
6: a = 4;
0040D7B8 mov dword ptr [ebp-4],4
7: a += (a++);
0040D7BF mov eax,dword ptr [ebp-4]
0040D7C2 add eax,dword ptr [ebp-4]
0040D7C5 mov dword ptr [ebp-4],eax
0040D7C8 mov ecx,dword ptr [ebp-4]
0040D7CB add ecx,1
0040D7CE mov dword ptr [ebp-4],ecx
a = 4;
a += (++a);
printf("%d\n",a);//10
10: a = 4;
0040D7E2 mov dword ptr [ebp-4],4
11: a += (++a);
0040D7E9 mov eax,dword ptr [ebp-4]
0040D7EC add eax,1
0040D7EF mov dword ptr [ebp-4],eax
0040D7F2 mov ecx,dword ptr [ebp-4]
0040D7F5 add ecx,dword ptr [ebp-4]
0040D7F8 mov dword ptr [ebp-4],ecx
a = 4;
//(a++) += a; //compile error
printf("%d\n",a);//4
a = 4;
(++a) += (a++);
printf("%d\n",a);//11
18: a = 4;
0040D824 mov dword ptr [ebp-4],4
19: (++a) += (a++);
0040D82B mov ecx,dword ptr [ebp-4]
0040D82E add ecx,1
0040D831 mov dword ptr [ebp-4],ecx
0040D834 mov edx,dword ptr [ebp-4]
0040D837 add edx,dword ptr [ebp-4]
0040D83A mov dword ptr [ebp-4],edx
0040D83D mov eax,dword ptr [ebp-4]
0040D840 add eax,1
0040D843 mov dword ptr [ebp-4],eax
a = 4;
(++a) += a;
printf("%d\n",a);//10
22: a = 4;
0040D857 mov dword ptr [ebp-4],4
23: (++a) += a;
0040D85E mov edx,dword ptr [ebp-4]
0040D861 add edx,1
0040D864 mov dword ptr [ebp-4],edx
0040D867 mov eax,dword ptr [ebp-4]
0040D86A add eax,dword ptr [ebp-4]
0040D86D mov dword ptr [ebp-4],eax
a = 4;
a = (a++) + (a++);
printf("%d\n",a);//10
27: a = 4;
0040D881 mov dword ptr [ebp-4],4
28: a = (a++) + (a++);
0040D888 mov edx,dword ptr [ebp-4]
0040D88B add edx,dword ptr [ebp-4]
0040D88E mov dword ptr [ebp-4],edx
0040D891 mov eax,dword ptr [ebp-4]
0040D894 add eax,1
0040D897 mov dword ptr [ebp-4],eax
0040D89A mov ecx,dword ptr [ebp-4]
0040D89D add ecx,1
0040D8A0 mov dword ptr [ebp-4],ecx
a = 4;
b = (a++) + (a++);
printf("%d\n",b);//8
31: a = 4;
0040D8B4 mov dword ptr [ebp-4],4
32: b = (a++) + (a++);
0040D8BB mov eax,dword ptr [ebp-4]
0040D8BE add eax,dword ptr [ebp-4]
0040D8C1 mov dword ptr [ebp-8],eax
0040D8C4 mov ecx,dword ptr [ebp-4]
0040D8C7 add ecx,1
0040D8CA mov dword ptr [ebp-4],ecx
0040D8CD mov edx,dword ptr [ebp-4]
0040D8D0 add edx,1
0040D8D3 mov dword ptr [ebp-4],edx
return 0;
}
=================感谢百度知道的注册用户Eternal_BSM===============================
其实这是一个很深邃的问题。在c/c++中规定:左操作数必须是一个左值。 a++在c/c++中的实现是: { int tmp=a; a=a+1; return tmp; } 这里的tmp为一个临时变量,是一个右值,对它赋值毫无意义。 ++a在c/c++中的实现是: { a=a+1; return a; } a为一个左值,可以赋值。 就效率而言++a应比a++的效率要高,因为a++要产生临时变量。 建议lz在网上找一些左值和右值的知识来看看,这也不是一两句话讲清的,理解这个对你有很大的帮助。