c語言入門:[14]while循環
上節我們學習的goto個人認為是初學者最好理解的循環語句,使用起來也很方便,goto語句使用起來非常靈活,但是就是因為太靈活了所以許多有編程的人都覺得goto往往會使程序難於閲讀造成邏輯混亂,有的時候寫代碼多了一會跳轉到這一會跳轉到那往往會把編程者自己都搞糊塗了更別説別人了,還有一點就是在c基礎上發展起來的c#和java編程語言裏不支持goto,所以我們還是要學習能夠替代goto的其它循環的寫法,這節我們來學習while循環,while循環有兩種形式下面分別作介紹。
while循環的第一種形式:
上節goto的例子如果用while寫就是這樣。
int main()
{
int i=0;
printf("一個循環語句的例子n");
do
{
printf("*");
i=i+1;
}while(i<10);//注意這裏必須寫分號
printf("hellon");
}
對比上節的goto我們可以這樣認為:
1>do相當於原來的標記,用來表示循環開始的地方,只不過這個是c語言裏的關鍵字不能自己隨便起了只能用do,另外do後面也不要加冒號。
2>while(i<10);是循環的判斷,相當於goto裏的if判斷,如果條件為真轉到do的位置重複執行,條件為假則循環終止。
3>用大括號括起來的部分是要重複執行的代碼,這個大括號不能省略。為了敍述方便以後我們管這部分代碼就叫循環體。
4>while(i<10);必須加分號,來表示語句結束。當你看到while的第二種寫法時你就會知道如果不加分號那while(i<10) printf("hellon");也能構成一個循環,所以為了避免歧義要求第一種寫法的循環條件後必須加分號。
我們可以看到對比goto,這樣寫更簡潔明瞭,結構清晰。
while循環的第二種形式:
此種形式是在第一種形式的基礎上進一步簡化,省略了do,上面的例子用這種形式寫法如下:
int main()
{
int i=0;
printf("一個循環語句的例子n");
while(i<10)
{
printf("*");
i=i+1;
}
printf("hellon");
}
要點解析:
1>此種寫法就跟if語句的寫法類似,大括號可以省略,如果不寫大括號那循環體就是while後面的第一條語句,你如果在while(i<10)後面直接加分號也可以,那樣循環體就為空。
2>while(i<10)不是判斷一次就拉倒,而是循環重複判斷,每次判斷只要條件為真就執行一次循環體。什麼時候判斷為假了while語句就結束,循環終止。像這個例子循環體被重複執行了10次而i<10這個條件卻判斷了11次,正是因為第11次判斷結果為假循環才終止了。
while的這兩種寫法是有區別的
第一種寫法是:先執行一遍循環體,然後再判斷
第二種寫法是:先判斷,條件不符合則直接退出,循環體可能一次都不被執行
用第一種寫法寫的程序都能修改成第二種寫法的形式。
通過下面的兩個例子來講解下
例題1:不停地從鍵盤輸入字符直到輸入q結束。
char ch;//用來存儲每次從鍵盤輸入的字符
scanf("%c",&ch);//重複執行這句話能夠實現“不停地從鍵盤輸入字符”的要求,而第一個字符總是要輸入的,也就是説這句話至少要執行一遍,適合do while
int main()
{
char ch;
do
{
scanf("%c",&ch);
}while(ch!='q'); //只要輸入的不是q就循環,重複執行scanf("%c",&ch);
}
運行這個例子當你從鍵盤輸入字符的時候最好輸入一個一回車,如下圖。
如果用第二種寫法改寫,我們就可以給ch一個初始值讓第一次循環判斷肯定成立,這樣scanf("%c",&ch);就至少會執行一次
int main()
{
char ch='a';
while(ch!='q')
{
scanf("%c",&ch);
}
}
第一次判斷ch!='q'肯定為真,因為ch裏初始存放的是'a'這個字符,所以scanf("%c",&ch);得到執行,ch裏的值變成了運行程序的人從鍵盤上輸入的一個字符
第二次判斷ch!='q' 結果就不一定了,因為我們也不知道ch裏存儲的是什麼,這要看運行程序的人從鍵盤輸入了什麼字符。
很顯然這種改寫的方式沒有第一種寫法好懂,而且寫起來還費事。
例題2:從鍵盤輸入一個自然數,輸入幾就輸出幾個星號。
分析下問題,如果我們輸入的是0,那一個星號都不輸出,所以我們需要先判斷,這種情況就適合用第二種寫法。
int main()
{
int i=0;
int n;//表示從鍵盤輸入的整數
printf("請輸入一個自然數:");
scanf("%d",&n);
while(i
{
printf("*");
i=i+1;
}
printf("n");
}