#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在网上找一些左值和右值的知识来看看,这也不是一两句话讲清的,理解这个对你有很大的帮助。