我們已經掌握了,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...