第 8 講:for 循環(huán)
for
語句的標(biāo)準(zhǔn)寫法
變量循環(huán)其實(shí)就是 while
和 do-while
語句的一種特別寫法,為了方便人的理解,才創(chuàng)立的這樣的循環(huán)操作,它是 while
的語法糖。
寫法是這樣的:
for
的括號(hào)里有三個(gè)語句,并且分別使用分號(hào)分開。原因在于它的寫法會(huì)被編譯為 while
語句,所以其實(shí)這些語句在 while
之中也都是需要加分號(hào)的,所以用分號(hào)隔開。兩個(gè)分號(hào)把括號(hào)內(nèi)的內(nèi)容分隔成了三個(gè)部分,按順序分別叫做初始值、條件、增量,即按變量來看的初始情況值,變量作循環(huán)需要滿足的條件(或叫每做完一次循環(huán)后的判斷條件),和每一次循環(huán)完成后變量需要變化的量。
它的解釋是這樣的:先賦初始值、然后判斷條件、條件成立時(shí)執(zhí)行循環(huán)里面的操作、然后對(duì)變量增加增量、然后判斷條件、然后條件成立時(shí)只需循環(huán)里面的操作、然后對(duì)變量增加增量、然后判斷條件,這樣的操作。
比如上面的寫法就是這樣的:
sum = 0
語句還可以直接寫在 for
for
殘缺 for
for
循環(huán)的分號(hào)內(nèi)的東西可有可無,比如不需要的時(shí)候就可以不寫,不過呢,分號(hào)不能省略。
這樣和上面的語句是等價(jià)的。畢竟賦初值可以在前面寫,也可以后面寫。
還可以這樣:
這樣還是等效的。
帶有逗號(hào)表達(dá)式的 for
在說這一點(diǎn)前,就不得不講一個(gè)東西:逗號(hào)表達(dá)式。
逗號(hào)表達(dá)式
逗號(hào)表達(dá)式發(fā)明出來的唯一用途就只是放在 for
里,因?yàn)?for
需要用分號(hào)分隔所有部分(初值、條件和增量),所以如果想要同時(shí)給多個(gè)變量賦初始值的時(shí)候,或者是給多個(gè)變量設(shè)定增量的時(shí)候,就可以使用它,而不影響分號(hào)。
但是,因?yàn)樗窃?C 語言里存在的語法點(diǎn),所以也可以使用在其他場(chǎng)合,雖然這一點(diǎn)并不多大意義。
在賦值操作后,a = 3 * 5, a * 4
就是一個(gè)逗號(hào)表達(dá)式。它由兩個(gè)部分構(gòu)成:a = 3 * 5
和 a * 4
。逗號(hào)表達(dá)式的計(jì)算是放在所有操作都執(zhí)行完了才會(huì)執(zhí)行的地方,這里是因?yàn)樗欣ㄌ?hào),所以會(huì)執(zhí)行。
運(yùn)算法則是這樣的,從左到右依次計(jì)算,逗號(hào)表達(dá)式里面每一個(gè)用逗號(hào)分開的部分都會(huì)計(jì)算一次,并取最后一個(gè)部分,作為整體表達(dá)式的數(shù)值。比如這里,從左至右,先讓 a
獲得一個(gè)數(shù)值是 15,然后計(jì)算 a * 4
,得到 60,這個(gè) 60 就是整體表達(dá)式的數(shù)值,最后賦值給 b
,所以 a = 15
、b = 60
。
不過,由于它最后才會(huì)被計(jì)算,所以如果沒有括號(hào)的話,就得小心了。
答案竟然是 231
!你敢信?我們來看看為什么。
首先,C 語言規(guī)定,它的計(jì)算順序是放在最后的,換句話說,賦值啥的所有操作全部在它前面。所以賦值會(huì)被先執(zhí)行,也就是這句話等于是以下三句話的簡(jiǎn)寫:
只是合并了而已。而這句話你也看得出,逗號(hào)表達(dá)式雖然要取出最后一個(gè)逗號(hào)部分作為表達(dá)式的數(shù)值,但因?yàn)檫\(yùn)算的關(guān)系,a++
已經(jīng)先被賦值給 c
了,所以最終逗號(hào)表達(dá)式整體數(shù)值結(jié)果其實(shí)并沒有什么用途,故這里其實(shí)只是相當(dāng)于合并書寫的一種操作罷了。
那么,c = a++
得到 c
的值應(yīng)為 1,因?yàn)?++
在后。而 a
最終是會(huì)變?yōu)?2 的。然后 b
則會(huì)因?yàn)楹竺鎯删湓?,而增大兩個(gè)單位。所以 b
應(yīng)為 3。所以 a = 2、b = 3、c = 1。
逗號(hào)表達(dá)式嵌套到 for
知道這一點(diǎn)之后,我們來看怎么嵌套。
我們知道,為 1 到 100 求和時(shí),除了為作為循環(huán)的變量 i
賦值外,還需要為 sum
給定初始值,否則 sum
從一個(gè)根本就不知道是多少的數(shù)開始增加,是錯(cuò)誤的。
所以我們可以這么寫:
當(dāng)然了,簡(jiǎn)化寫法:
也是 OK 的。注意,這次 for
因?yàn)闆]有大括號(hào)的關(guān)系,循環(huán)的部分就只有 for
帶上這個(gè)小括號(hào)這一部分而已。所以加上了分號(hào),表示它在這里截?cái)啵?/span>for
的語句只能到這里。
為什么經(jīng)常把 for
里用的變量命名為 i
?
這是一個(gè)很好的問題。你記住一點(diǎn),它誕生自人們的習(xí)慣。之前就說過,變量名稱只會(huì)受到標(biāo)識(shí)符命名規(guī)則的約束,所以取名這一點(diǎn)才是關(guān)鍵。我們最初經(jīng)常使用到 int
類型來表示整數(shù),除非萬不得已才會(huì)調(diào)整類型。而在 for
循環(huán)里,我們常常使用 int
類型的變量作為循環(huán)的成員。而這個(gè)變量一般表示循環(huán)的量,所以它不太好取名。為了簡(jiǎn)單化處理,我們一般使用它的類型名稱的首字母就直接作為了這個(gè)變量的名字。比如這里的 int
變量就直接叫做 i
。包括后續(xù)會(huì)介紹到的嵌套循環(huán),那么里面的變量就叫做 j
,按著順序排下來,從 i
開始,i
、j
、k
、……。
當(dāng)然,如果是一個(gè)字符類型的變量作為初始變量,那么一般就叫做 c
或者 ch
,其它的變量按類型取名也都是一樣的規(guī)則。