现在的位置: 首页 > 综合 > 正文

关于a++和++a

2019年10月15日 ⁄ 综合 ⁄ 共 2126字 ⁄ 字号 评论关闭
#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在网上找一些左值和右值的知识来看看,这也不是一两句话讲清的,理解这个对你有很大的帮助。

 

抱歉!评论已关闭.