先写个代码:

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:先判断,再执行函数。