关于i++与++i背后的一些引发思考的问题
看论坛上有人对i++和++i之类的话题表示很反感,认为太简单了,可是真的简单么?
首先上一段简单代码
int i = 0;
printf("%d\n",i++);
i = 0;
printf("%d\n",++i);
004013BA |. C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 ;将i赋值为0
004013C1 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ;将i的值放到寄存器eax中
004013C4 |. 894424 04 MOV DWORD PTR SS:[ESP+4],EAX ;将eax的值放到栈中,注意,这就是入栈的过程,printf("..",i);中i的出处
004013C8 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] ;将i的地址赋值给寄存器eax
004013CB |. FF00 INC DWORD PTR DS:[EAX] ;将i的值自增1
004013CD |. C70424 000044>MOV DWORD PTR SS:[ESP],Untitled.00440000 ;printf的参数"%d\n"
004013D4 |. E8 B7F20000 CALL <JMP.&msvcrt.printf> ;调用printf函数
004013D9 |. C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 ;将i赋值为0
004013E0 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] ;将i的地址赋值给eax
004013E3 |. FF00 INC DWORD PTR DS:[EAX] ;将i自增1
004013E5 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ;将i的值赋值给eax
004013E8 |. 894424 04 MOV DWORD PTR SS:[ESP+4],EAX ;将eax的值入栈,同上i的出处
004013EC |. C70424 000044>MOV DWORD PTR SS:[ESP],Untitled.00440000 ;printf的参数"\d\n"
004013F3 |. E8 98F20000 CALL <JMP.&msvcrt.printf> ;调用
004113BE C745 F8 0000000>MOV DWORD PTR SS:[EBP-8],0;将i的值赋值为0
004113C5 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8];将i的值放到eax中
004113C8 8985 30FFFFFF MOV DWORD PTR SS:[EBP-D0],EAX;保存eax,非i
004113CE 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8];用ecx保存i的值
004113D1 83C1 01 ADD ECX,1;ecx的值自增1
004113D4 894D F8 MOV DWORD PTR SS:[EBP-8],ECX;然后将ecx的值赋值给i
004113D7 8BF4 MOV ESI,ESP;用esi保存栈顶指针
004113D9 8B95 30FFFFFF MOV EDX,DWORD PTR SS:[EBP-D0];将保存的eax的数的值赋值给edx
004113DF 52 PUSH EDX;入栈edx
004113E0 68 3C574100 PUSH tmp.0041573C ;"%d\n"
004113E5 FF15 BC824100 CALL DWORD PTR DS:[<&MSVCR90D.printf>] ;调用printf
004113EB 83C4 08 ADD ESP,8;_cdecl调用约定,调用完成后恢复堆栈平衡
004113EE 3BF4 CMP ESI,ESP;比较esi和esp的值是否相同
004113F0 E8 50FDFFFF CALL tmp.00411145;检查堆栈是否平衡,函数名为CheckEsp
004113F5 C745 F8 0000000>MOV DWORD PTR SS:[EBP-8],0
004113FC 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004113FF 83C0 01 ADD EAX,1
00411402 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
00411405 8BF4 MOV ESI,ESP
00411407 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
0041140A 51 PUSH ECX
0041140B 68 3C574100 PUSH tmp.0041573C ; ASCII "%d
"
00411410 FF15 BC824100 CALL DWORD PTR DS:[<&MSVCR90D.printf>] ; MSVCR90D.printf
00411416 83C4 08 ADD ESP,8
int i = 0;
DWORD ThreadProc(LPVOID pParam)
{
i++;
return 0;
}
int main()
{
for(int tmp = 0; tmp < 100; tmp++)
{
HANDLE handle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,0,0,NULL);
CloseHandle(handle);
}
cout << i << endl;
system("pause");
}
#define MAX(a,b) ((a) >= (b) ? (a) : (b))
int main()
{
int a = 10;
int b = 5;
printf("较大的值是:%d\n",MAX(a++,b));
system("pause");
}
int num = 0x3fffffff;
int i = 0;
clock_t begin;
clock_t end;
begin = clock();
while(num--)
{
i++;
}
end = clock();
printf("i++所用的时间是:%d\n",end - begin);
num = 0x3fffffff;
begin = clock();
while(num--)
{
++i;
}
end = clock();
printf("++i所用的时间是:%d\n",end - begin);
int i = 0;
printf("i的字节数为:%d\n",sizeof(++i));
printf("i的值为:%d\n",i);
system("pause");