臥槽,爲什麼你的程序執行到一半就退出了,原來是因爲加了這個

快到月底了,相信有很多人都和呆博一樣,不是“快揭不開鍋了”,而是已經快要把鍋都吃了〒▽〒。沒關係我們可以一起吃掉這篇精神食糧啊,營養又健康,如果覺得味道還不錯,別忘了繼續支持哦~

友情提示:本節課有許多回顧之前內容的部分,如果你忘記了,可以點擊文中給出的鏈接回顧一下~

一般來講,在進入循環體之後,會執行該循環體內的所有內容,叫做一次循環;當該次循環結束後會再次判斷,看是否會進入下一次的循環。但是有的時候,我們會希望在程序在執行了循環體的一半時退出,直接跳出本輪循環,或者忽略下面的語句開始下一輪的循環。具體來講的話,就是通過 break 語句和 continue 語句來實現。接下來我們將具體講解 break 語句和 continue 語句的使用方法,以及再變成中容易調入的小陷阱。

1

break 語句

break 語句在之前的 嘿~這裏有一份超實用的 switch 教程,真的好想推薦給你 中有講過。

當 switch 跳到某個位置之後,就會一直往下執行,比如說它滿足了 case 常量表達式1 的要求之後會自動執行剩下的所有的語句和程序塊,而無需判斷是否滿足前面所對應的 case 。所以如果只希執行某一個 case 後面的語句和程序塊,還需要配合一個 break 語句,讓代碼在適當的位置跳出 switch 。

在循環體中,如果我們想要讓程序在中途跳出循環,那麼我們同樣可以使用 break 語句來實現,直接跳出循環體。

舉個栗子,如下是一個數是否是素數的代碼

這段程序相當於窮舉從 2 到 n//2 的所有數字,來判斷是否存在一個數字可以整除待判斷的數字。很明顯,每次執行這個程序會至少執行 n//2 -2 遍。假如輸入的是 10,其實在 i=2 時候就可以得到最終的結果了,但是後面的那些步驟還是會執行的,這就造成了對於資源和時間的浪費。

如果我們將 break 的註釋去掉,那麼很明顯當已經判斷該數是質數之後,會直接跳出循環體,結束整個循環,並返回判定結果 – 該數是一個素數。

有一點需要注意的是,對於嵌套循環來說,break 語句只負責跳出所在的那一層循環,要跳出外層循環則需要再佈置一個 break 語句才行。

我們同樣以《8. 一花一世界,while for 循環?》中的例子來說明,將 2.4 部分改寫爲如下的形式

觀察上面的代碼,首先思考一個問題,這段代碼會輸出什麼?當 i=0 的時候,j 的值會一直增大直至到 3。當 j = 3 的時候遇到 break 跳出該層循環,但是剛剛講過,他只能跳出一層循環,所以還會繼續執行 i 的那層循環,然後還是j 的值會一直增大直至到 3……這樣一直下去,最後打印輸出的當然是 i = 10, j = 3。明顯,break 只能跳出一層循環,如果想在 j=3 的時候跳出兩層循環,將註釋的部分去掉就可以了。

2

continue 語句

還有一種情況是在滿足某一種情況的時候,跳過本輪循環下面的語句,開始下一輪循環,可以使用 continue 語句。當使用 continue 語句的時候,循環體剩餘的語句將會被忽略,開始下一次的循環。

比如說下面這個例子

在之前的《5. 很“迷”的字符與字符串》的 3.2 部分有講過,getchar() 函數返回的是一個 int 型的數,所以在聲明的時候寫的是 int ch;,putchar(ch); 是將剛剛接收到的字符輸出。在這段代碼中循環的終止條件是接收到一個回車字符,對於輸入的每一個字符,如果是大寫的 C 就結束本輪循環,開啓下一輪,所以上面代碼的作用就是去掉輸入字符中指定的字母C。

使用 gcc 進行編譯執行,輸入 ABCD,可以得到 ABC。

與 break 相同的是,continue 也只能作用於一層循環體。兩者的不同點在於, break 直接跳出循環體,相當於提前結束了整個循環;但是 continue 只是結束本輪循環,更新計數器之後,開始新的一輪循環

3

while 語句與 for 語句

經過《8. 一花一世界,while for 循環?》的學習,你可能會認爲 while 語句與 for 語句的功能是相同的,但是實際上兩者的執行過程是有區別的,它們的區別在於出現 continue 語句時,比如說下面的這段代碼

雖然沒有什麼實質的功能,只是用來評測兩種循環的效果,但是這段代碼是可以順利執行完畢的,但是如果我們將它改寫爲如下的 while 形式

會陷入什麼樣的情況呢?沒錯死循環。當 i=0 的時候 i%2=0,不會執行 continue,執行 i++;然後當 i=1 的時候, i%2=1,會執行 continue,忽略下面的 i++;之後的都是這樣的,陷入了死循環。

所以我們可以看到,在 for 語句中,continue 語句跳過循環的剩餘部分,直接回到調整部分。在 while 語句中,調整部分是循環體的一部分,因此 continue 語句會把它也跳過。所以在 while 語句中千萬不要把更新計數器(如 i++)放在 continue 語句的下面,否則很容易陷入死循環。當然,你如果是出與一些目的特意設計成這個樣子也是沒有問題的~

參考

[1] “小甲魚” 視頻課程《帶你學C帶你飛》【第一季】P15

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章