你已經(jīng)初步了解C是如何處理循環(huán)的,但是你可能不是很清楚布爾表達(dá)式i < argc
是什么。在學(xué)習(xí)while
循環(huán)之前,讓我先來(lái)對(duì)布爾表達(dá)式做一些解釋。
在C語(yǔ)言中,實(shí)際上沒(méi)有真正的“布爾”類型,而是用一個(gè)整數(shù)來(lái)代替,0代表false
,其它值代表true
。上一個(gè)練習(xí)中表達(dá)式i < argc
實(shí)際上值為1或者0,并不像Python是顯式的Ture
或者False
。這是C語(yǔ)言更接近計(jì)算機(jī)工作方式的另一個(gè)例子,因?yàn)橛?jì)算機(jī)只把值當(dāng)成數(shù)字。
現(xiàn)在用while
循環(huán)來(lái)實(shí)現(xiàn)和上一個(gè)練習(xí)相同的函數(shù)。這會(huì)讓你兩種循環(huán),看看兩種循環(huán)是什么關(guān)系。
#include <stdio.h>
int main(int argc, char *argv[])
{
// go through each string in argv
int i = 0;
while(i < argc) {
printf("arg %d: %s\n", i, argv[i]);
i++;
}
// let's make our own array of strings
char *states[] = {
"California", "Oregon",
"Washington", "Texas"
};
int num_states = 4;
i = 0; // watch for this
while(i < num_states) {
printf("state %d: %s\n", i, states[i]);
i++;
}
return 0;
}
你可以看到while
循環(huán)的語(yǔ)法更加簡(jiǎn)單:
while(TEST) {
CODE;
}
只要TEST
為true
(非0),就會(huì)一直運(yùn)行CODE
中的代碼。這意味著如果要達(dá)到和for
循環(huán)同樣的效果,我們需要自己寫(xiě)初始化語(yǔ)句,以及自己來(lái)增加i
。
輸出基本相同,所以我做了一點(diǎn)修改,你可以看到它運(yùn)行的另一種方式。
$ make ex11
cc -Wall -g ex11.c -o ex11
$ ./ex11
arg 0: ./ex11
state 0: California
state 1: Oregon
state 2: Washington
state 3: Texas
$
$ ./ex11 test it
arg 0: ./ex11
arg 1: test
arg 2: it
state 0: California
state 1: Oregon
state 2: Washington
state 3: Texas
$
在你自己的代碼中,應(yīng)有限選擇for
循環(huán)而不是while
循環(huán),因?yàn)?code>for循環(huán)不容易崩潰。下面是幾點(diǎn)普遍的原因:
int i
,使循環(huán)發(fā)生錯(cuò)誤。i
,于是i
還保留著第一個(gè)循環(huán)結(jié)束時(shí)的值。你的第二個(gè)循環(huán)可能執(zhí)行也可能不會(huì)執(zhí)行。i++
自增,你會(huì)得到一個(gè)“死循環(huán)”,它是在你開(kāi)始編程的第一個(gè)或前兩個(gè)十年中,最可怕的問(wèn)題之一。i--
從argc
開(kāi)始遞減直到0。你可能需要做一些算數(shù)操作讓數(shù)組的下標(biāo)正常工作。while
循環(huán)將argv
中的值復(fù)制到states
。argv
之中有很多元素也不會(huì)全部放進(jìn)states
。