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");
}