先写个代码:
void main()
{
int a=9;
cout<<"tip1"<<endl;
for (int i=0;i<a;i++)
{
cout<<i<<endl;
}
cout<<"tip2"<<endl;
do
{
cout<<a<<endl;
a--;
} while (a);
cout<<"tip3"<<endl;
while(a<9)
{
cout<<a<<endl;
a++;
}
cout<<"tip4"<<endl;
system("pause");
}
DEBUG版本的分析:
00401648 . C745 FC 09000>MOV DWORD PTR SS:[EBP-4],9 ; a=9
0040164F . 68 C8104000 PUSH test5.004010C8
00401654 . 68 44004700 PUSH OFFSET test5.??_C@_04HPCL@tip1?$AA@ ; tip1
00401659 . 68 A0DE4700 PUSH OFFSET test5.std::cout
0040165E . E8 27FCFFFF CALL test5.0040128A
00401663 . 83C4 08 ADD ESP,8
00401666 . 8BC8 MOV ECX,EAX
00401668 . E8 73FBFFFF CALL test5.004011E0 ; 下面开始for循环
0040166D . C745 F8 00000>MOV DWORD PTR SS:[EBP-8],0 ; int i=0
00401674 . EB 09 JMP SHORT test5.0040167F
00401676 > 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00401679 . 83C0 01 ADD EAX,1 ; 累加1
0040167C . 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX ; i++
0040167F > 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00401682 . 3B4D FC CMP ECX,DWORD PTR SS:[EBP-4] ; i与a比较大小
00401685 . 7D 1C JGE SHORT test5.004016A3 ; 大于等于则跳转 执行cout<<"tip2"<<endl;结束循环
00401687 . 68 C8104000 PUSH test5.004010C8
0040168C . 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
0040168F . 52 PUSH EDX ; out i
00401690 . B9 A0DE4700 MOV ECX,OFFSET test5.std::cout
00401695 . E8 65FAFFFF CALL test5.004010FF
0040169A . 8BC8 MOV ECX,EAX
0040169C . E8 3FFBFFFF CALL test5.004011E0
004016A1 .^ EB D3 JMP SHORT test5.00401676 ; 回跳到00401676
004016A3 > 68 C8104000 PUSH test5.004010C8
004016A8 . 68 3C004700 PUSH OFFSET test5.??_C@_04IAJC@tip2?$AA@ ; tip2
004016AD . 68 A0DE4700 PUSH OFFSET test5.std::cout
004016B2 . E8 D3FBFFFF CALL test5.0040128A
004016B7 . 83C4 08 ADD ESP,8
004016BA . 8BC8 MOV ECX,EAX
004016BC . E8 1FFBFFFF CALL test5.004011E0 ; 下面开始 do循环
004016C1 > 68 C8104000 PUSH test5.004010C8
004016C6 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004016C9 . 50 PUSH EAX ; out a
004016CA . B9 A0DE4700 MOV ECX,OFFSET test5.std::cout
004016CF . E8 2BFAFFFF CALL test5.004010FF
004016D4 . 8BC8 MOV ECX,EAX
004016D6 . E8 05FBFFFF CALL test5.004011E0
004016DB . 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
004016DE . 83E9 01 SUB ECX,1 ; a++
004016E1 . 894D FC MOV DWORD PTR SS:[EBP-4],ECX
004016E4 . 837D FC 00 CMP DWORD PTR SS:[EBP-4],0 ; 0与a比较
004016E8 .^ 75 D7 JNZ SHORT test5.004016C1 ; 0小于等于a则跳转到 004016C1
004016EA . 68 C8104000 PUSH test5.004010C8
004016EF . 68 34004700 PUSH OFFSET test5.??_C@_04CKAF@tip3?$AA@ ; tip3
004016F4 . 68 A0DE4700 PUSH OFFSET test5.std::cout
004016F9 . E8 8CFBFFFF CALL test5.0040128A
004016FE . 83C4 08 ADD ESP,8
00401701 . 8BC8 MOV ECX,EAX
00401703 . E8 D8FAFFFF CALL test5.004011E0 ; 开始while 循环
00401708 > 837D FC 09 CMP DWORD PTR SS:[EBP-4],9 ; 9与a比较
0040170C . 7D 25 JGE SHORT test5.00401733 ; 9大于等于a则跳出
0040170E . 68 C8104000 PUSH test5.004010C8
00401713 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00401716 . 52 PUSH EDX ; out a
00401717 . B9 A0DE4700 MOV ECX,OFFSET test5.std::cout
0040171C . E8 DEF9FFFF CALL test5.004010FF
00401721 . 8BC8 MOV ECX,EAX
00401723 . E8 B8FAFFFF CALL test5.004011E0
00401728 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040172B . 83C0 01 ADD EAX,1 ; a++
0040172E . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00401731 .^ EB D5 JMP SHORT test5.00401708
00401733 > 68 C8104000 PUSH test5.004010C8
00401738 . 68 2C004700 PUSH OFFSET test5.??_C@_04HPOA@tip4?$AA@ ; tip4
0040173D . 68 A0DE4700 PUSH OFFSET test5.std::cout
00401742 . E8 43FBFFFF CALL test5.0040128A
00401747 . 83C4 08 ADD ESP,8
0040174A . 8BC8 MOV ECX,EAX
0040174C . E8 8FFAFFFF CALL test5.004011E0
00401751 . 6A 09 PUSH 9
00401753 . E8 CEFAFFFF CALL test5.00401226
00401758 . 83C4 04 ADD ESP,4
0040175B . 68 24004700 PUSH OFFSET test5.??_C@_05PBCN@pause?$AA@ ; /pause
00401760 . E8 FBF30100 CALL test5.system ; \system
小结:for:先初始化,然后判断,执行函数。
do:先执行函数,再判断。
while:先判断,再执行函数。