关于a++和++a

来源:互联网 发布:java基础代码的编写 编辑:程序博客网 时间:2024/06/04 19:33
#include <stdio.h>int main(){int a,b;a = 4;a += (a++);printf("%d\n",a);//96:        a = 4;0040D7B8   mov         dword ptr [ebp-4],47:        a += (a++);0040D7BF   mov         eax,dword ptr [ebp-4]0040D7C2   add         eax,dword ptr [ebp-4]0040D7C5   mov         dword ptr [ebp-4],eax0040D7C8   mov         ecx,dword ptr [ebp-4]0040D7CB   add         ecx,10040D7CE   mov         dword ptr [ebp-4],ecxa = 4;a += (++a);printf("%d\n",a);//1010:       a = 4;0040D7E2   mov         dword ptr [ebp-4],411:       a += (++a);0040D7E9   mov         eax,dword ptr [ebp-4]0040D7EC   add         eax,10040D7EF   mov         dword ptr [ebp-4],eax0040D7F2   mov         ecx,dword ptr [ebp-4]0040D7F5   add         ecx,dword ptr [ebp-4]0040D7F8   mov         dword ptr [ebp-4],ecxa = 4;//(a++) += a;//compile errorprintf("%d\n",a);//4a = 4;(++a) += (a++);printf("%d\n",a);//1118:       a = 4;0040D824   mov         dword ptr [ebp-4],419:       (++a) += (a++);0040D82B   mov         ecx,dword ptr [ebp-4]0040D82E   add         ecx,10040D831   mov         dword ptr [ebp-4],ecx0040D834   mov         edx,dword ptr [ebp-4]0040D837   add         edx,dword ptr [ebp-4]0040D83A   mov         dword ptr [ebp-4],edx0040D83D   mov         eax,dword ptr [ebp-4]0040D840   add         eax,10040D843   mov         dword ptr [ebp-4],eaxa = 4;(++a) += a;printf("%d\n",a);//1022:       a = 4;0040D857   mov         dword ptr [ebp-4],423:       (++a) += a;0040D85E   mov         edx,dword ptr [ebp-4]0040D861   add         edx,10040D864   mov         dword ptr [ebp-4],edx0040D867   mov         eax,dword ptr [ebp-4]0040D86A   add         eax,dword ptr [ebp-4]0040D86D   mov         dword ptr [ebp-4],eaxa = 4;a = (a++) + (a++);printf("%d\n",a);//1027:       a = 4;0040D881   mov         dword ptr [ebp-4],428:       a = (a++) + (a++);0040D888   mov         edx,dword ptr [ebp-4]0040D88B   add         edx,dword ptr [ebp-4]0040D88E   mov         dword ptr [ebp-4],edx0040D891   mov         eax,dword ptr [ebp-4]0040D894   add         eax,10040D897   mov         dword ptr [ebp-4],eax0040D89A   mov         ecx,dword ptr [ebp-4]0040D89D   add         ecx,10040D8A0   mov         dword ptr [ebp-4],ecxa = 4;b = (a++) + (a++);printf("%d\n",b);//831:       a = 4;0040D8B4   mov         dword ptr [ebp-4],432:       b = (a++) + (a++);0040D8BB   mov         eax,dword ptr [ebp-4]0040D8BE   add         eax,dword ptr [ebp-4]0040D8C1   mov         dword ptr [ebp-8],eax0040D8C4   mov         ecx,dword ptr [ebp-4]0040D8C7   add         ecx,10040D8CA   mov         dword ptr [ebp-4],ecx0040D8CD   mov         edx,dword ptr [ebp-4]0040D8D0   add         edx,10040D8D3   mov         dword ptr [ebp-4],edxreturn 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在网上找一些左值和右值的知识来看看,这也不是一两句话讲清的,理解这个对你有很大的帮助。