迴圈是我們程式設計中遇到的另外一項重要技術。通過反覆的迭代運算,我們可以獲取想要的任何結果。當然這種迭代是有基本條件的,或是以時間為條件的,或是以空間為條件的,或者是某一種外來互動作為條件的。迴圈的方式有很多種,但是常用的還是:while、for、do-while、goto這幾種。很多公司的專案都不喜歡goto,這其中倒不是說goto不好,主要是goto的隨意性太大,一旦用的不好,就會降低**的可讀性,反而影響其他人的工作效率。
(1)do-while為什麼先執行,後判斷?
老規矩,我們還是先看**示例再說:
[cpp]view plain
copy
21:
intm = 10;
00401638 mov dword ptr [ebp-4],0ah
22: do
while
(m < 10);
00401659 cmp dword ptr [ebp-4],0ah
0040165d jl process+1fh (0040163f)
如果換成while呢?
[cpp]view plain
copy
21:
intm = 10;
00401638 mov dword ptr [ebp-4],0ah
22: while
(m < 20)
0040163f cmp dword ptr [ebp-4],14h
00401643 jge process+41h (00401661)
23:
0040165f jmp process+1fh (0040163f)
27: }
其實,上面的**表現已經很明顯了。do-while的時候,模組上來先進行運算,然後再判斷資料範圍的大小;while就不一樣,上來就進行判斷,判斷成功就繼續執行,否則就退出迴圈模組,如果是for的情況呢?
[cpp]view plain
copy
21:
for(
intm = 10; m < 20; m++)
00401638 mov dword ptr [ebp-4],0ah
0040163f jmp process+2ah (0040164a)
00401641 mov eax,dword ptr [ebp-4]
00401644 add eax,1
00401647 mov dword ptr [ebp-4],eax
0040164a cmp dword ptr [ebp-4],14h
0040164e jge process+4ch (0040166c)
22:
0040166a jmp process+21h (00401641)
我們發現,其實for和上面的while,do-while有點小區別。在m第一次賦值的時候,並不進行加1處理,而是直接跳到位址0x40164a處執行,判斷m數值和20進行判斷。判斷成功,則跳入迴圈模組,否則越過迴圈模組。那麼,在迴圈處理結束後呢?也就是m++後,迴圈模組是怎麼處理的?我們發現**又回到了0x00401641處處理。但是這裡並不是整個迴圈模組開始出的**,而是對m進行自增處理。完成自增後,繼續判斷,下面的流程和第一次一樣,不再贅述。
(2)多重迴圈怎麼跳出來?
[cpp]view plain
copy
intflag = 0;
for(
intm = 1; m < 20 && !flag; m++)
} }
(3)while(1)是否有其他的表示方法?
[cpp]view plain
copy
intflag = 0;
for(;;)
dowhile
(1);
loop:
if(!flag)
goto
loop;
總結:其實,迴圈中還有很多的細節需要處理,你比如說:
(1)迴圈的時候請務必填上程式終止的條件
(2)迴圈的時候注意8位char和32和int之間的區別,務必不要死迴圈
(3)字元的迴圈務必注意『\0』
(4)不要把迴圈、判斷合二為1,給你的同事留條活路,不要以為while(*dst ++ = *src ++);這樣寫**很帥
(5)務必注意自己的返回值是你需要的那個位址,還是前乙個位址,還是下乙個位址
(6)不要在for(;;)中新增額外的語句,加的越多,風險越多
用彙編的眼光看C (之迴圈流程)
迴圈是我們程式設計中遇到的另外一項重要技術。通過反覆的迭代運算,我們可以獲取想要的任何結果。當然這種迭代是有基本條件的,或是以時間為條件的,或是以空間為條件的,或者是某一種外來互動作為條件的。迴圈的方式有很多種,但是常用的還是 while for do while goto這幾種。很多公司的專案都不...
用彙編的眼光看C (之退出流程)
無論是在判斷還是在迴圈的過程中,通常在遇到合適的條件的時候就會退出相應的模組。跳出模組執行的方式很多,break,continue,return都可以。下面我們就可以分別對他們進行將介紹。1 continue只能用於迴圈,而break迴圈 判斷都可以應用。兩者有什麼區別呢?view plain 21...
用彙編的眼光看C (之退出流程)
無論是在判斷還是在迴圈的過程中,通常在遇到合適的條件的時候就會退出相應的模組。跳出模組執行的方式很多,break,continue,return都可以。下面我們就可以分別對他們進行將介紹。1 continue只能用於迴圈,而break迴圈 判斷都可以應用。兩者有什麼區別呢?21 for int m ...