第 6 講:while 循環(huán)
循環(huán)是什么?
在我們寫代碼的時候,難免遇到重復的操作。例如我想嘗試從 1 到 100 求和。但顯然,數學公式可以解決這一點:
顯然,這種模式完全可以解決這個問題。不過,從代碼的角度來看,我們也可以嘗試讓電腦計算 100 次求和的操作,這樣依然可以解決,而且電腦運算得很快,所以我們完全可以忽略 100 次重復計算和一次計算公式得到結果的時間差。這個時間差我們完全感覺不到。
那么,如何進行重復性的運算呢?我們先理清楚執(zhí)行思路:

如圖所示,我們首先為 i
和 S
賦值,這些數值在后續(xù)都會使用到,這個稱為初始值。然后,我們嘗試先判斷一次是否這個數字 i
超過了 100。如果沒有超過,我們就執(zhí)行第一次把 i
累加到 S
之中??梢?S
表示整個計算的和值結果。接著,i
增大一個單位。于是,我們重新作一次判斷,看此時的 i
是否超過了 100(超過 100 就不計算在內了)。如果沒有超過,就重復操作,繼續(xù)把 i
的新數值累加到 S
之中,并再次增大 i
一個單位;如果 i
已經超過了 100,整個計算的活動行為就結束了。于是我們此時輸出 S
的結果,并退出程序,整個程序執(zhí)行完畢。
看得出來,這個邏輯是比較清楚的。
while
(循環(huán))語句
說完基本的計算思路,下面我們來說說它的代碼的語法格式。
基本寫法
while
語句可以解決上述的寫法。我們嘗試來看一下整體的邏輯。
首先我們依舊嘗試為 i
和 S
進行初始賦值,然后直接進入循環(huán)部分。當 i
不超過 100 的時候,就進行累加,并且要增大 i
變量的數值。最后執(zhí)行完畢后,輸出 S
的結果即可。
由此可見,這個類型的執(zhí)行邏輯還是比較清晰的。有一點看起來像是瑕疵的地方在于,我們明明知道 i
此時初始數值是 1,沒有超過 100,而為什么非要在最開始就寫上判斷條件 i <= 100
來判斷是否小于等于 100 呢?這不是廢話嗎?
實際上,這個程序當你輸入了一個無效的數值時,比如 107,這個時候根本不可能計算從 107 到 100 的和(我們的目的是從 1 增大到 100,而 107 超過了 100),所以直接就退出了循環(huán)。另外,while
語句的格式要求把條件放到最開始,所以我們不得不這么做。
所以,總的來說,while
語句的寫法是這樣的:
在 while
旁邊寫執(zhí)行的元素的判斷條件,然后在大括號里寫上執(zhí)行反復操作的語句。
while
語句也經常被稱為while
循環(huán)。
作出優(yōu)化
顯然,在前文我們學習了自增自減運算符的前后綴書寫方式的計算問題。當 ++
寫在變量之后,則表示變量在使用完成后最后增大一個單位。這使得我們原本需要寫成兩句話的語句可以寫成一句話:
這個寫法等價于先執(zhí)行 sum += i;
語句,然后執(zhí)行 i++;
語句增大 i
變量一個單位。
所以,while
語句和 if
執(zhí)行的模式完全一樣,如果重復執(zhí)行的語句只有一個語句,則可以省略大括號,所以上述寫法融入到 while
里則可以寫成這樣:
另外一個示例
下面我們來看另外一則示例。我們還是用求和的思路來講解,不過我們稍作改動。如果我們要計算從 1 到某個數的和,不過問題變?yōu)榱恕闭埱蟪鰪?1 到 n 的所有整數的和 S 在第一次超過 2400 的時候,此時的 n 的值“。這個問題怎么解決呢?
實際上,可能你想得很復雜。我們知道,while
語句的寫法是一個條件加上重復運算的語句,所以這個題目完全可以只修改執(zhí)行的條件:
S <= 2400
,其它的地方都沒變化。最后只需要輸出 i