第五章學習極少了表達式以及運算符,淺嘗使用了一次循環(while)。寫完之後發現閱讀量不高,找下自己原因可能是有點過于啰嗦了吧。
那第六章就直接開始啦!正式進入到學習循環階段。C語言中循環隻有三種——for、while、do while,還是比較好記住的,但是用法需要注意。
學習參考書籍《C Primer Plus》
1,While循環
在第五章的時候已經簡單介紹和使用了While循環,下邊程式做了一個求和運算(整型運算),結束循環使用的是利用scanf()的傳回值來結束循環。
#include <stdio.h>
int main(void)
{
long num;
long sum = 0L; //首先聲明sum初始值設定為0,此處使用了long類型(0L)
int status;
printf("Please enter an integer to be summed ");
printf("(q to quit): ");
status = scanf("%ld", &num);
while (status == 1) //使用了==運算符号,這個是真的等于号。
{
sum = sum + num;
printf("Please enter next integer (q to quit): ");
status = scanf("%ld", &num);
}
printf("Those integers sum to %ld.\n", sum);
return 0;
}
上述程式中使用了==符号,在之前篇章中強調了很多次關于“=”是指派的意思。其次在使用sum聲明類型中使用long類型是為了存儲更大的整數,是以将sum初始化為0L(long類型的0),而不是0(int類型的0)。程式結果如下:
Please enter an integer to be summed (q to quit): 44
Please enter next integer (q to quit): 336
Please enter next integer (q to quit): q
Those integers sum to 435.
這個循環程式是根據測試條件status ==1,隻要status等于1,循環就會重複。每次循環,num的目前值都被加到sum上,這樣sum的值始終是目前整數之和。當status的值不為1時,循環結束。這個程式有意思的就在于status的值是怎麼變化的:
1,如果scanf()成功讀取一個整數,就把該數存入num并傳回1,随後傳回值将被賦給status(注意,使用者輸入的值存儲在num中,不是status中)。這樣做同時更新了num和status的值,while循環進入下一次疊代。
2,如果使用者輸入的不是數字(如,q或者任何其他字元),scanf()會讀取失敗并傳回0。此時,status的值就是0,循環結束。
上述方式比較費腦子,其實有簡單的辦法退出循環也就是在循環中添加代碼,例如每次循環時詢問使用者“是否繼續循環?<y/n>”,然後判斷使用者是否輸入y。這個辦法雖然有點蠢,但Linux以及很多網絡裝置中仍然使用這種方法選擇是否進入下一步。
自制流程圖
是以總結來看while循環是入口條件循環,程式在進入循環體之前必須擷取輸入的資料并檢查status的值(作為一種條件),是以在while前面要有一個輸入并且不一定是scanf。要讓循環繼續執行,在循環内需要一個讀取資料的語句,這樣程式才能擷取下一個條件的值。
1.1,終止循環(while)
while循環有一點非常重要:在建構while循環時,必須讓測試表達式的值有變化。否則,循環就不會終止(會讓程式一直循環下去直到計算機卡死)。
1.2,入口條件循環
在1.2中總結描述了while需要入口在才能進行循環操作,也就是所謂“有條件”指的是語句部分的執行取決于測試表達式描述的條件,如(a < 6)。是以在日常使用中可以使用C語言中的運算關系來進行使用條件(類似大于、小于、等于、不等于、不大于等于等等)。
2,for循環
for循環與while循環中的三個行為寫在了一起;
for (size_t i = 0; i < count; i++)
for循環的第1行包含了循環所需的所有資訊:i的初值,i的終值(循環的出口條件)和每次循環i的增量。
用下邊的程式來舉例讓大家更簡單認識for循環:
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 11; i++)
printf("%d seconds!\n", i);
return 0;
}
下面程式的運作結果:
輸出結果
這個程式每次對i進行累加,累加到10後退出for循環。
當然for的寫法還有很多,比如下面的寫法:
#include <stdio.h>
int main(void)
{
int x;
int y = 0;
for (x = 0; y <= 75; y = (++x * 5) + 50)
printf("%10d %10d\n", x, y);
return 0;
}
該循環列印x的值和表達式++x * 5 + 50的值,程式的輸出如下:
輸出結果
是以for語言的寫法相對簡便,for語句是一種入口條件循環,即在執行循環之前就決定了是否執行循環。
3,do while循環
while循環和for循環都是入口條件循環,即在循環的每次疊代之前檢查測試條件,是以有可能根本不執行循環體中的内容。C語言還有一種條件循環,即在循環的每次疊代之後檢查測試條件,至少執行循環體中的内容一次。
這種循環被稱為do while循環,通用的表達式為以下公式:
do
statement
while ( expression );
do while循環在執行完循環體後才執行測試條件,是以至少執行循環體一次;而for循環或while循環都是在執行循環體之前先執行測試條件。do while循環适用于那些至少要疊代一次的循環。
4,選擇一個适用的循環
首先,确定是需要入口條件循環還是出口條件循環。通常,入口條件循環用得比較多,有幾個原因。其一,一般原則是在執行循環之前測試條件比較好。其二,測試放在循環的開頭,程式的可讀性更高。另外,在許多應用中,要求在一開始不滿足測試條件時就直接跳過整個循環。
這就是為什麼需要在講do while時候用的篇幅較小,主要講解for和while。
一般而言,當循環涉及初始化和更新變量時,用for循環比較合适,而在其他情況下用while循環更好。對于下面這種條件,用while循環就很合适:
while (scanf("%ld", &num) == 4)
對于涉及索引計數的循環,用for循環更适合。例如:
for (count = 0; count <= 200; count++)
是以個人建議是while與for學号走遍天下!
5,總結
本章主要是講解循環的知識内容,本來打算适用兩章來講,但想了一下不要寫得過于分散,增加學習閱讀體驗。在C語言中使用循環特别注意的三點内容:
注意循環的測試條件要能使循環結束。
確定循環測試中的值在首次使用之前已初始化。
確定循環在每次疊代都更新測試的值。
時間精力有限,盡量提升閱讀體驗吧,發現想寫的簡單,但是又覺得寫的簡單了又不好讓讀者讀懂。如有不足或有疑問歡迎各位大佬們指正,同時也希望非IT專業的小白們能感受到C語言的魅力所在。如果對你有幫助的話點贊收藏哦!嘿嘿
[1] 《C Primer Plus》