文 | Edward
2 循環執行語句
計算機有一個強大的能力,快速地重複執行某一計算,這種重複計算多次的方法,是通過軟體中的循環執行語句去實現的。C語言中實現循環語句結構的方式有三種,第一種為「for」循環,第二種為「while」循環,第三種為「do……while」循環。不管是那種循環,其循環的方式都是類似的,即在某一條件成立的情況下(為True,或者非0),某一範圍內的某條或某幾條語句就會被一次循環執行,循環執行語句的示意如圖3-8-7所示。
圖3-8-7 循環執行語句
(1)while循環
while語句的一般使用形式為:
while(判斷條件)
{
執行語句;
}
其中判斷條件可以為表達式,也可以是一個變量,只要表達式或者變量不為0,那麼while後面的執行語句將一直被循環執行。如果while條件後面只跟隨一句執行語句,那麼while後面的一對「{}」可以不加。
例如,當我們需要連續列印出1到100的時候,用while語句即可輕鬆實現,其實現代碼如圖3-8-8所示。
圖3-8-8 while循環列印
圖3-8-8代碼中,i定義完成之後,賦初值為1,「i <= 100」是一個判斷條件,只要這個表達式為1,即條件成立,那麼代碼就一直會把「i」列印出來,而變量i每次在列印完成之後,就對自己加1,這樣,當執行99次之後,i=100,此時「i <= 100」這個條件還是成立,進而再執行一次「i+1」,此時i=101了,再去判斷「i<=100」已經不成立了,因此while循環最終退出。
當然,C語言在設計之初就設計了循環的退出機制,「continue」和「break」就是循環退出機制的兩個關鍵詞。這兩個關鍵詞雖然都可以使while循環中斷退出,但是其效果和功能有著非常大的區別。「break」關鍵詞是讓整個while循環徹底退出,而「continue」關鍵詞是讓本次的循環中斷運行,進而進行下一次while的循環以決定這個循環需不需要繼續執行下去。關於「continue」關鍵詞我們可以做一個簡單的程序來說明一下其功能。如圖3-8-9所示。
圖3-8-9 continue關鍵詞
這個程序的主體和圖3-8-8中的代碼一樣,只不過加了一個判斷條件,當i加到5的時候進行判斷,直接給變量i賦值200,之後再運行continue語句,由於continue語句執行了,因此循環在此處就中斷了,直接進行while條件的判斷,而此時下面的printf語句也就不會被執行了。在while的判斷下,發現此時「i <= 100」這個條件不成立了,因此退出了while循環。
利用while循環和continue的組合,我們還可以做很多有趣的程序,如,找出1~1000中所有能被3整除的整數。程序代碼如圖3-8-10所示。
圖3-8-10 找出1000以內能被3整除的數
而break的語法就是直接退出整個while循環,我們可以寫一個軟體來驗證這個while的用法,做一個鍵盤字符獲取程序,程序平時一直在等待按鍵輸入,並將按下的按鍵列印出來,直到當按下小寫字符「k」的時候,程序列印出goodbye並且退出。如圖3-8-11所示,此時while的判斷條件是一個常數1,因此可以說while在任何情況下都不會退出,但是一旦當獲取到的按鍵為「k」,此時if判斷語句中的條件就成立,運行break語句,最終列印出good bye,並且退出while(1)這個循環。可能做純軟體的讀者會覺得我這裡的while(1)用的非常荒唐,再怎麼樣也要寫一個退出條件比較考究,但是在很多的裸機系統中,就是通過一個while(1)的大循環使晶片裡面的程序連續運行的。
圖3-8-11 按鍵字符判斷
(2)do……while循環
do……while語句,在一些書上也稱作do語句,它很像while語句,只是它的運行條件判斷,要在循環體執行完一次之後再去判斷。所以,這種結構的循環體至少會被運行一次,下面是它的語法。
既然while和do……while的用法很相似,那我們如何在它們之間進行選擇呢?
當需要循環體至少執行一次的時候,選擇do。
比如,還是一個按鍵判斷的程序,當輸入的字符不為小寫字母「k」的時候,將這個數字列印出來,如果是小寫字母「k」就退出程序,列印出good bye。這個程序由於要求我們對輸入的第一個字符就需要判斷,因此在不用break和while(1)的情況下,我們可以直接使用do……while的形式來完成。其代碼如圖3-8-12所示。
圖3-8-12 字符判斷程序
(3)for循環
C語言中,for循環語句是while循環語句的一種簡化方法,for語句的一般形式為:
通過上幾小節的練習,我們發現一個規律,即有限次數的循環程序,一般都會定義一個控制循環次數的變量,而for循環語句中的表達式1為初始化部分,即我們可以對定義的這個控制循環次數變量進行初始化。表達式2為條件部分,當表達式2成立的時候(True,非0),for循環一直運行下去,一旦當表達式2的條件不滿足,則退出for循環。表達式3為調整部分,它在每一次循環體運行完成一遍之後,都會執行表達式3。與while循環一樣,在for語句中,也可以使用break語句和continue語句來中斷循環。
如我們需要找出1~1000中所有能被3整除的整數,除了圖3-8-10中用while循環的程序外,還可以用for語句來實現。如圖3-8-13所示。
圖3-8-13 for語句尋找能被3整除的數
圖3-8-13,for語句後面的三個表達式分別為:
初始條件:i = 1;
判斷條件:i <= 1000;
調整語句:i ++;這裡的i可以根據需求自行調節。
循環控制語句後面我們在實際使用中會頻繁用到,因此後面讓我們來慢慢探索。