for迴圈中的三語句執行順序
阿新 • • 發佈:2019-02-04
for迴圈的執行語法是:
for(<;初始化>;<條件表示式>;<增量>) 語句;
初始化總是一個賦值語句,它用來給迴圈控制變數賦初值;條件表示式是一個關係表示式,它決定什麼時候退出迴圈;增量定義迴圈控制變數每迴圈一次後按什麼方式變化。這三個部分之間用";"分開。
在for迴圈中的三個語句執行順序是如何的呢?通過對彙編程式碼的除錯發現了其中的玄機。
for( int i = 0;i <= 10;i++)
{
cout<<i<<endl;
}
反編譯後的程式碼如下for( int i = 0;i <= 10;i++) 00413632 mov dword ptr [i],0 00413639 jmp main+104h (413644h) 0041363B mov eax,dword ptr [i] 0041363E add eax,1 00413641 mov dword ptr [i],eax 00413644 cmp dword ptr [i],0Ah 00413648 jg main+13Ch (41367Ch) { cout<<i<<endl; 0041364A mov esi,esp 0041364C mov eax,dword ptr [__imp_std::endl (418290h)] 00413651 push eax 00413652 mov edi,esp 00413654 mov ecx,dword ptr [i] 00413657 push ecx 00413658 mov ecx,dword ptr [__imp_std::cout (418288h)] 0041365E call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (418298h)] 00413664 cmp edi,esp 00413666 call @ILT+315(__RTC_CheckEsp) (411140h) 0041366B mov ecx,eax 0041366D call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (418294h)] 00413673 cmp esi,esp 00413675 call @ILT+315(__RTC_CheckEsp) (411140h) } 0041367A jmp main+0FBh (41363Bh) 0041367C mov dword ptr [i],0
可以看到for迴圈的執行過程是:
1.首先對變數int i進行賦值,而後從第3行跳到第7行;
2.執行條件表示式,判斷是否跳出迴圈;
3.執行for迴圈體;
4.執行迴圈體完畢後,從26行跳轉到第4行,執行增量語句,再順序判斷條件表示式;
5.執行for迴圈體。。。