天天看點

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

作者:正能量IT先生

小編這周一直在複習準備今天的考試,考試情況總結來說“不容樂觀”。頓悟了順應時代發展,要加速雲改數轉技術轉型了。

以上都是小編的吐槽;C語言還是要繼續學習下去啦!下面進入第八章的學習内容了,這章内容主要是判斷語句中的多重選擇else if以及邏輯運算符。

學習參考書籍《C Primer Plus》

1,判斷語句多重選擇else if

第七章學習了if語句,但是在程式中也可以進行多種選擇分析實際上else if是已學過的if else語句的變式。下面用一個階梯電價計算過程作為示範

#include <stdio.h>
#define RATE1   0.10              // 第一梯度電價
#define RATE2   0.15             // 第二梯度電價
#define RATE3   0.24            // 第三梯度電價
#define RATE4   0.32             // 第四梯度電價
#define BREAK1  370.0                 // 第一梯度上限
#define BREAK2  450.0                 // 第二梯度上限
#define BREAK3  700.0                 // 第三梯度上限
#define BASE1   (RATE1 * BREAK1)      // 第一梯度電費
#define BASE2  (BASE1 + (RATE2 * (BREAK2 - BREAK1)))   // 第二梯度電費
#define BASE3  (BASE2 + (RATE3 *(BREAK3 - BREAK2)))    // 第三梯度電費
int main(void)
{
     double kwh;                       // 使用的千瓦時
     double bill;                      // 電費

     printf("Please enter the kwh used.\n");
     scanf("%lf", &kwh);               // %lf對應double類型
     if (kwh <= BREAK1)
          bill = RATE1 * kwh;
     else if (kwh <= BREAK2)           // 在第二梯度之内
          bill = BASE1 + (RATE2 * (kwh - BREAK1));
     else if (kwh <= BREAK3)           // 在第三梯度之内
          bill = BASE2 + (RATE3 * (kwh - BREAK2));
     else                              // 在第四梯度之後
          bill = BASE3 + (RATE4 * (kwh - BREAK3));
     printf("The charge for %.1f kwh is $%1.2f.\n", kwh, bill);

     return 0;
}           

該程式根據kwh的值在3個公式之間選擇一個。特别要注意的是,如果kwh大于370,程式隻會到達第1個else。是以,else if (kwh <= BREAK2)這行相當于要求kwh在370~450之間,如程式注釋所示。同理可知,隻有當kwh的值超過700時,才會執行最後的else。最後,注意BASE1、BASE2和BASE3分别代表370、450和700千瓦時的總費用。是以,當電量超過這些值時,隻需要加上額外的費用即可。

輸出結果:

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

輸出結果

同理就像一開始說的else if是已學過的if else語句的變式,是以第二種寫法可以是:

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

if elsehapp變式

也就是說,該程式由一個if else語句組成,else部分包含另一個if else語句,該if else語句的else部分又包含另一個if else語句。第2個if else語句嵌套在第 1個if else語句中,第3個if else語句嵌套在第2個if else語句中。值得注意的是:

整個if else語句被視為一條語句,是以不必把嵌套的if else語句用花括号({})括起來。當然,花括号({})可以更清楚地表明這種特殊格式的含義。

if else語句作為一條單獨的語句可以不使用花括号。外層if也是一條單獨的語句,也可以不用花括号。但是,當語句太長時,使用花括号能提高代碼的可讀性,而且還可防止今後在if循環中添加其他語句時忘記加花括号。

2,else與if配對

如果程式中有許多if和else,編譯器如何知道哪個if對應哪個else,下面這個程式來回答這個問題:

if (number > 6)
     if (number < 12)
          printf("You're close!\n");
else
     printf("Sorry, you lose a turn!\n");           

何時列印Sorry, you lose a turn!?當number小于或等于6時,還是number大于12時?換言之,else與第1個if還是第2個if比對?答案是,else與第2個if比對。也就是說,輸入的數字和比對的響應如下:

數字      響應
5         None
10        You’re close!
15        Sorry, you lose a turn!           

是以從上面的例子可以看出,規則是如果沒有花括号,else與離它最近的if比對,除非最近的if被花括号括起來。

if (number > 6)
{
     if (number < 12)
          printf("You're close!\n");
}
else
     printf("Sorry, you lose a turn!\n");           

這樣輸出結果就可以按照else比對最上邊的if了。

數字      響應
5         Sorry, you lose a turn!
10        You’re close!
15        None           

3,邏輯運算符

根據之前的章節學到的内容,if語句和while語句通常使用關系表達式作為測試條件。在實際應用中将多個關系表達式組合起來會更加便捷。例如,要編寫一個程式,計算輸入的一行句子中除單引号和雙引号以外其他字元的數量,這種情況下可以使用邏輯運算符,同時複習getchae():

#include <stdio.h>
#define PERIOD '.'
int main(void)
{
     char ch;
     int charcount = 0;

     while ((ch = getchar()) != PERIOD)
     {
          if (ch != '"' && ch != '\'')
               charcount++;
     }
     printf("There are %d non-quote characters.\n", charcount);

     return 0;
}           

程式首先讀入一個字元,并檢查它是否是一個句點,因為句點标志一個句子的結束。接下來,if語句的測試條件中使用了邏輯與運算符&&。該if語句翻譯成文字是“如果待測試的字元不是雙引号,并且它也不是單引号,那麼charcount遞增1”。邏輯運算符兩側的條件必須都為真,整個表達式才為真。邏輯運算符的優先級比關系運算符低,是以不必在子表達式兩側加圓括号。

常用的邏輯關系:

邏輯運算符号 邏輯含義
&&
||

優先級來說:非>與>或

當然記不住優先級時候在寫程式時候可以使用(),用括号括起來是無敵的存在!

3.1,補充學習使用<iso646.h>

C語言是在美國用美式鍵盤開發的語言。但在世界各地并非所有的鍵盤都有和美式鍵盤(日本、南韓)一樣的符号。是以,C99标準新增了可代替邏輯運算符的拼寫,它們被定義在iso646.h頭檔案中。如果在程式中包含該頭檔案,便可用and代替&&、or代替||、not代替!。可以了解為之後程式設計語言進行演進,python已經使用and、or、not進行判斷了。至于C為什麼一直使用這種符号,總結來說一個字:軸!

4,本章小結

本章介紹C語言中判斷語句的後部分,算是對于第七章的補充;同時還有一些細節用高亮符号進行标黃了,時間有限建議大家在下邊多多練習嘗試更改參數進行編譯調試這樣更能加深了解。所有章節的程式都是使用的代碼塊進行編寫的,大家懶得抄可以直接複制粘貼進行修改内容。最後小編再吐槽一下今天的考試:真的沒事不會有人吃飽了撐的背概念的,所有的題都是簡答真的就沒有意思了,出個備選答案讓填寫也行。深刻學習雲改數轉戰略,往雲計算發展。

如有不足或有疑問歡迎各位大佬們指正,同時也希望非IT專業的小白們能感受到C語言的魅力所在。如果對你有幫助的話點贊收藏!

[1] 《C Primer Plus》

繼續閱讀