你已經(jīng)初步了解C是如何處理循環(huán)的,但是你可能不是很清楚布爾表達(dá)式i < argc
是什么。在學(xué)習(xí)while
循環(huán)之前,讓我先來對布爾表達(dá)式做一些解釋。
在C語言中,實際上沒有真正的“布爾”類型,而是用一個整數(shù)來代替,0代表false
,其它值代表true
。上一個練習(xí)中表達(dá)式i < argc
實際上值為1或者0,并不像Python是顯式的Ture
或者False
。這是C語言更接近計算機(jī)工作方式的另一個例子,因為計算機(jī)只把值當(dāng)成數(shù)字。
現(xiàn)在用while
循環(huán)來實現(xiàn)和上一個練習(xí)相同的函數(shù)。這會讓你兩種循環(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)的語法更加簡單:
while(TEST) {
CODE;
}
只要TEST
為true
(非0),就會一直運行CODE
中的代碼。這意味著如果要達(dá)到和for
循環(huán)同樣的效果,我們需要自己寫初始化語句,以及自己來增加i
。
輸出基本相同,所以我做了一點修改,你可以看到它運行的另一種方式。
$ 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),因為for
循環(huán)不容易崩潰。下面是幾點普遍的原因:
int i
,使循環(huán)發(fā)生錯誤。i
,于是i
還保留著第一個循環(huán)結(jié)束時的值。你的第二個循環(huán)可能執(zhí)行也可能不會執(zhí)行。i++
自增,你會得到一個“死循環(huán)”,它是在你開始編程的第一個或前兩個十年中,最可怕的問題之一。i--
從argc
開始遞減直到0。你可能需要做一些算數(shù)操作讓數(shù)組的下標(biāo)正常工作。while
循環(huán)將argv
中的值復(fù)制到states
。argv
之中有很多元素也不會全部放進(jìn)states
。