天天看點

C語言學習筆記系列—第六章

作者:正能量IT先生

第五章學習極少了表達式以及運算符,淺嘗使用了一次循環(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以及很多網絡裝置中仍然使用這種方法選擇是否進入下一步。

C語言學習筆記系列—第六章

自制流程圖

是以總結來看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;
}           

下面程式的運作結果:

C語言學習筆記系列—第六章

輸出結果

這個程式每次對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的值,程式的輸出如下:

C語言學習筆記系列—第六章

輸出結果

是以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》

繼續閱讀