C語言入門筆記 第五講 迴圈語句之while

2021-10-15 00:10:59 字數 4701 閱讀 6325

我們已經掌握了,if語句。

當條件滿足的情況下,if語句後的語句執行,否則不執行。但是這個語句只會執行一次。

但是我們發現生活中很多的實際的例子是:同一件事情我們需要完成很多次。

那我們怎麼做呢? c語言中給我們引入了:

while,

for,

do while

三種語句,

可以實現迴圈。

//while 語法結構

while(表示式)

迴圈語句;

表示式為真,執行迴圈語句;

直到表示式為假,不再執行。 

比如我們實現:

在螢幕上列印1-10的數字。

#include int main()

return 0;

}

break

int main() 

return 0;

}

這裡**輸出結果為:

1 2 3 4

總結:

break在while迴圈中的作用:

其實在迴圈中只要遇到break,就停止後期的所有的迴圈,直接終止迴圈。 所以:while中的 break是用於永久終止迴圈的。

continue

//continue **例項1

#include int main()

return 0;

}

這裡的**輸出結果為:

1 2 3 4 並且程式並沒有結束。

原因在於,當i===5時,if判斷通過,從而執行continue;

那麼continue後面的語句全部不執行,直接繼續執行下一次while迴圈。

下一次while迴圈時,由於i還是等於5,所以繼續執行下乙個if語句,再判斷,再continue,

從而成為了乙個死迴圈,

一直在

while(i<=10)

return 0;

}

這裡的**輸出結果為:

1 2 3 4 6 7 8 9 10 11

總結:

continue是用於終止本次迴圈的,也就是本次迴圈中continue後邊的**不會再執行,而是直接 跳轉到while語句的判斷部分。進行下一次迴圈的入口判斷。

再看兩個**例項:

#include int main()

番外--getchar()函式和putchar()函式的作用

int ch = getchar();

putchar(ch);

printf("%c\n",ch);

putchar(ch);

printf("%c\n",ch);

這兩個語句等價。

getchar()函式讓計算機讀取乙個字元,這個字元由我們來輸入;

而putchar()函式讓計算機將這個字元輸出。

至於為什麼它的型別是int,

因為getchar函式的返回值是使用者輸入的字元的ascii碼。

而再用printf函式,將列印型別改為「%c」,即可將這個ascii碼轉換成對應的字元。

putchar()函式則簡化了上述步驟。

注意,getchar()函式只能讀乙個字元,scanf可以讀乙個字串。

那麼為什麼這段程式【**1】能讀乙個串呢?

如使用者在按回車之前輸入了不止乙個字元,其他字元會保留在鍵盤快取區中,等待後續getchar呼叫讀取。

也就是說,後續的getchar呼叫不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完後,才等待使用者按鍵。

使用者按完鍵以後,putchar會把棧/佇列裡的字元乙個乙個輸出,這就導致了用可以讀乙個字串,而不是唯讀字串的第乙個字元。

番外二--eof是什麼

eof是乙個計算機術語,為end of file的縮寫,是檔案結束標誌

在作業系統中表示資料來源無更多的資料可讀取。

資料來源通常稱為檔案或串流。

通常在文字的最後存在此字元表示資料結束。

它的值是-1。

那麼如何獲取乙個eof呢?

當我們輸入crtl+z時,

會發現程式停止了執行。

我們看乙個番外**

int main() 

; printf("請輸入密碼:");

scanf("%s", password);//輸入密碼,並存放在password陣列中

printf("請確認(y/n)");

int ret = 0;

ret = getchar();//y/n

if (ret == 'y')

else

return 0;

}

按照我們的想法,我們會輸一遍密碼,然後輸入y or n來確認;

然而,程式執行的結果是:

還沒有到確認的那一步,程式就停止執行了。

原因是: 

我們先來看一看ret裡面存放的是什麼:

先按f10進行逐句執行

再 除錯--視窗--監視

發現ret裡存放的值是10。

10對應的ascii碼是\n

而這個回車被ret悄悄地拿走了,並存放了進去。

輸入函式【scanf和getchar】的執行過程:

有乙個區域叫做輸入緩衝區,輸入函式會去緩衝區中找,等待緩衝區**現東西。

當我們輸入了東西,被存到了輸入緩衝區中;

一旦輸入緩衝區**現了資料,

輸入函式就把它讀走。

我們輸入123456\n,

由於\n是乙個轉義字元,所以scanf函式會先把123456給讀走

這時候緩衝區中還留了乙個\n

到了getchar(),

它來緩衝區一看,發現有個\n,於是把它讀走。

而這時候ret的ascii碼值並不是y的ascii碼值,

所以不執行if,執行else。

所以會直接列印放棄確認。

這就是整個程式的執行過程。

【題外話:以下程式可以執行:

int ret = 'y';

cout << ret;

執行結果為89。

如果令int 變數等於乙個字元,那麼其實他存放的其實是這個字元的ascii碼值。】

那麼如何讓這段**1正確執行?

我們想讓ret在打完回車後,緩衝區是空的,等待我們輸入乙個新的資料。

我們可以在輸入完密碼後,再執行乙個getchar()函式,把緩衝區裡的『\n』讀走。

**如下:

int main() 

; printf("請輸入密碼:");

scanf("%s", password);//輸入密碼,並存放在password陣列中

//緩衝區還剩餘乙個『\n』

//讀取一下『\n』

getchar();

//不關心這個『\n』讀到哪了。

printf("請確認(y/n)");

int ret = 0;

ret = getchar();//y/n

if (ret == 'y')

else if(ret == 'n')

else

return 0;

}

這樣**暫時可正常跑完。

又出現了新的問題:

假如輸入一串字元:123456 abcd

因為scanf函式只會讀取空格前的字元,

所以讀完123456就會停止;

這時候,getchar讀下乙個字元,

把\n讀走了。

還剩abcd;

然後ret把a都走了,然而a並不是y n中的乙個,

所以會出現「請輸入yn」。

那麼怎麼解決?

我們可以寫乙個迴圈:

while(ch=getchar()!='\n')

讓這個迴圈不斷地讀,直到讀到乙個回車。

讓回車被ch接受,然後跳出迴圈,

從而執行後面的**。

#include int main()

return 0;

}

**意思是,只列印0~9的數,不然就跳走,繼續下一次迴圈,直到遇到乙個eof(即ctrl+z)

這段**可指定接收某些字元。

C語言入門筆記 第五講 迴圈語句之for

for迴圈是用的最多的迴圈,其次是while,最後是do while。for 表示式1 表示式2 表示式3 迴圈語句 表示式1表示式1為初始化部分,用於初始化迴圈變數的。表示式2表示式2為條件判斷部分,用於判斷 迴圈時候終止。表示式3表示式3為調整部分,用於迴圈條件的調整。我們來看乙個例子 使用fo...

C語言入門筆記 第五講 番外篇 goto語句

c語言中提供了可以隨意濫用的goto語句和標記跳轉的標號。從理論上 goto語句是沒有必要的,實踐中沒有goto語句也可以很容易的寫出 但是某些場合下goto語句還是用得著的,最常見的用法就是終止程式在某些深度巢狀的結構的處理過 程,例如一次跳出兩層或多層迴圈。這種情況使用break是達不到目的的。...

C語言入門(四)之switch 迴圈語句

switch格式 switch 條件表示式 如何結束switch語句 1.遇到break 2.執行到switch對應的大括號的結束 switch的條件表示式必須是返回整數的表示式,也就是說 中只能放整數。或者寫能夠轉換為整數的型別也可以,例如char,因為char型別可以轉換為int型別,所以寫ch...