嵌入式C語言基礎編程—5年程式設計師給你講解C語言分支結構程序設計

it百科大學堂 發佈 2020-05-14T03:45:28+00:00

本文主要是對C基礎編程關於分支程序結構設計的初步講解,屬於C編程入門的小白基礎課,後續會深入講解C高級相關的概念(C大神可先略過)。 本人近期會陸續上傳IT編程相關的資料和視頻教程,可以關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯網等。

本文主要是對C基礎編程關於分支程序結構設計的初步講解,屬於C編程入門的小白基礎課,後續會深入講解C高級相關的概念(C大神可先略過)。 本人近期會陸續上傳IT編程相關的資料和視頻教程,可以關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯網等。想學編程的朋友進入主頁即可看到相關教程和資料。

本文的主要內容為:

0分支結構程序

1關係運算符和表達式

1.1關係運算符及其優先次序

1.2關係表達式

2邏輯運算符和表達式

2.1邏輯運算符極其優先次序

2.2邏輯運算的值

2.3邏輯表達式

3if 語句 62

3.1if 語句的三種形式

3.2if 語句的嵌套

3.3條件運算符合條件表達式

4switch 語句

5程序舉例

5.1 關係運算符和表達式

在程序中經常需要比較兩個量的大小關係,以決定程序下一步的工作。比較兩個量的運 算符稱為關係運算符。

5.1.1 關係運算符及其優先次序


在C語言中有以下關係運算符:

1) < 小於

2) <= 小於或等於

3) > 大於

4) >= 大於或等於

5) == 等於

6) != 不等於

關係運算符都是雙目運算符,其結合性均為左結合。關係運算符的優先級低於算術運算 符,高於賦值運算符。 在六個關係運算符中,<,<=,>,>=的優先級相同,高於==和!=,==和!= 的優先級相同。

5.1.2 關係表達式


關係表達式的一般形式為:

表達式 關係運算符 表達式

例如:

都是合法的關係表達式。由於表達式也可以又是關係表達式。 因此也允許出現嵌套的情況。例如:

關係表達式的值是真"和"假",用"1"和"0"表示。如:

5 > 0 的值為"真",即為 1。

(a=3) > (b=5)由於 3>5 不成立,故其值為假,即為 0。

【例 5.1】

在本例中求出了各種關係運算符的值。字符變量是以它對應的 ASCII 碼參與運算的。對於含多個關係運算符的表達式,如 k==j==i+5,根據運算符的左結合性,先計算 k==j,該式不成立,其值為 0,再計算 0==i+5,也不成立,故表達式值為 0。

5.2 邏輯運算符和表達式


5.2.1 邏輯運算符極其優先次序


C語言中提供了三種邏輯運算符:

1) && 與運算

2) || 或運算

3) ! 非運算

與運算符&&和或運算符||均為雙目運算符。具有左結合性。非運算符!為單目運算符,具 有右結合性。邏輯運算符和其它運算符優先級的關係可表示如下:


!(非)算術運算符關係運算符

&& 和 ||

賦值運算符

!(非)→&&(與)→||(或)

"&&"和"||"低於關係運算符,"!"高於算術運算符。 按照運算符的優先順序可以得出:


5.2.2 邏輯運算的值

邏輯運算的值也為"真"和"假"兩種,用"1"和"0 "來表示。其求值規則如下:

1. 與運算 &&:參與運算的兩個量都為真時,結果才為真,否則為假。例如:

5>0 && 4>2

由於 5>0 為真,4>2 也為真,相與的結果也為真。

2. 或運算||:參與運算的兩個量只要有一個為真,結果就為真。 兩個量都為假時,結果為假。

例如:

5>0||5>8

由於 5>0 為真,相或的結果也就為真。

3. 非運算!:參與運算量為真時,結果為假;參與運算量為假時,結果為真。 例如:

!(5>0)

的結果為假。

雖然C編譯在給出邏輯運算值時,以"1"代表"真","0 "代表"假"。 但反過來在判斷一個量是為"真"還是為"假"時,以"0"代表"假",以非"0"的數值作為

"真"。例如:

由於 5 和 3 均為非"0"因此 5&&3 的值為"真",即為 1。又如:

5||0 的值為"真",即為 1。

5.2.3 邏輯表達式

邏輯表達式的一般形式為:

表達式 邏輯運算符 表達式

其中的表達式可以又是邏輯表達式,從而組成了嵌套的情形。 例如:

(a&&b)&&c

根據邏輯運算符的左結合性,上式也可寫為: a&&b&&c

邏輯表達式的值是式中各種邏輯運算的最後值,以"1"和"0"分別代表"真"和"假"。

【例 5.2】


本例中!x 和!y 分別為 0,!x*!y 也為 0,故其輸出值為 0。由於 x 為非 0,故!!!x 的邏輯值為 0。對 x|| i && j-3 式,先計算 j-3 的值為非 0,再求 i && j-3 的邏輯值為 1,故 x||i&&j-3的邏輯值為 1。對 i<j&&x<y 式,由於 i<j 的值為 1,而 x<y 為 0 故表達式的值為 1,0 相遇, 最後為 0,對 i==5&&c&&(j=8)式,由於 i==5 為假,即值為 0,該表達式由兩個與運算組成, 所以整個表達式的值為 0。對於式 x+ y||i+j+k 由於 x+y 的值為非 0,故整個或表達式的值為1。

5.3 if 語句

用 if 語句可以構成分支結構。它根據給定的條件進行判斷,以決定執行某個分支程序段。

C語言的 if 語句有三種基本形式。

5.3.1 if 語句的三種形式


1. 第一種形式為基本形式:if

if(表達式) 語句

其語義是:如果表達式的值為真,則執行其後的語句, 否則不執行該語句。其過程可表示為下圖。

【例 5.3】

本例程序中,輸入兩個數 a,b。把 a 先賦予變量 max,再用 if 語句判別 max 和 b 的大小,

如 max 小於 b,則把 b 賦予 max。因此 max 中總是大數,最後輸出 max 的值。

2. 第二種形式為: if-else

if(表達式)

語句 1; else

語句 2;

其語義是:如果表達式的值為真,則執行語句 1,否則執行語句 2 。

其執行過程可表示為下圖。

【例 5.4】

輸入兩個整數,輸出其中的大數。

改用 if-else 語句判別 a,b 的大小,若 a 大,則輸出 a,否則輸出 b。

3. 第三種形式為 if-else-if 形式

前二種形式的 if 語句一般都用於兩個分支的情況。 當有多個分支選擇時,可採用if-else-if 語句,其一般形式為:

if(表達式 1)

語句 1;

else if(表達式 2)語句 2;

else if(表達式 3)

語句 3;

else if(表達式 m)語句 m;

else

語句 n;

其語義是:依次判斷表達式的值,當出現某個值為真時,則執行其對應的語句。然後跳到整個 if 語句之外繼續執行程序。 如果所有的表達式均為假,則執行語句 n。然後繼續執行後續程序。 if-else-if 語句的執行過程如圖 3—3 所示。


【例 5.5】


本例要求判別鍵盤輸入字符的類別。可以根據輸入字符的 ASCII 碼來判別類型。由 ASCII 碼錶可知 ASCII 值小於 32 的為控制字符。 在"0"和"9"之間的為數字,在"A"和"Z" 之間為大寫字母, 在"a"和"z"之間為小寫字母,其餘則為其它字符。 這是一個多分支選擇的問題,用 if-else-if 語句編程,判斷輸入字符 ASCII 碼所在的範圍,分別給出不同的輸出。例如輸入為"g",輸出顯示它為小寫字符。

4. 在使用 if 語句中還應注意以下問題:

1) 在三種形式的 if 語句中,在 if 關鍵字之後均為表達式。 該表達式通常是邏輯表達式或關係表達式, 但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。

例如:

if(a=5) 語句;

if(b) 語句;

都是允許的。只要表達式的值為非 0,即為"真"。如在:

if(a=5)…;

中表達式的值永遠為非 0,所以其後的語句總是要執行的,當然這種情況在程序中不一定會出現,但在語法上是合法的。

又如,有程序段:

if(a=b)

printf("%d",a); else

printf("a=0");

本語句的語義是,把 b 值賦予 a,如為非 0 則輸出該值,否則輸出"a=0"字符串。這種用法在程序中是經常出現的。

2) 在 if 語句中,條件判斷表達式必須用括號括起來,在語句之後必須加分號。

3) 在 if 語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執行一組(多個)語句,則必須把這一組語句用{}括起來組成一個複合語句。但要注意的是在}之後不 能再加分號。

例如:


5.3.2 if 語句的嵌套


當 if 語句中的執行語句又是 if 語句時,則構成了 if 語句嵌套的情形。其一般形式可表示如下:

if(表達式)

if 語句; 或者為

if(表達式)

if 語句; else

if 語句;

在嵌套內的 if 語句可能又是 if-else 型的,這將會出現多個 if 和多個 else 重疊的情況, 這時要特別注意 if 和 else 的配對問題。

例如:

if(表達式 1)

if(表達式 2)

語句 1; else

語句 2;

其中的 else 究竟是與哪一個 if 配對呢? 應該理解為:

if(表達式 1)

if(表達式 2) 語句 1;

else

語句 2;

還是應理解為:

if(表達式 1)

if(表達式 2)

語句 1;

else

語句 2;

為了避免這種二義性,C語言規定,else 總是與它前面最近的 if 配對,因此對上述例子應按前一種情況理解。

【例 5.6】


比較兩個數的大小關係。

本例中用了 if 語句的嵌套結構。採用嵌套結構實質上是為了進行多分支選擇,實際上有三種選擇即 A>B、A<B 或 A=B。這種問題用 if-else-if 語句也可以完成。而且程序更加清晰。因此,在一般情況下較少使用 if 語句的嵌套結構。以使程序更便於閱讀理解。

【例 5.7】


5.3.3 條件運算符合條件表達式


如果在條件語句中,只執行單個的賦值語句時, 常可使用條件表達式來實現。不但使程序簡潔,也提高了運行效率。

條件運算符為?和:,它是一個三目運算符,即有三個參與運算的量。由條件運算符組成條件表達式的一般形式為:

表達式 1? 表達式 2: 表達式 3

其求值規則為:如果表達式 1 的值為真,則以表達式 2 的值作為條件表達式的值,否則以表達式 2 的值作為整個條件表達式的值。條件表達式通常用於賦值語句之中。 例如條件語句:


可用條件表達式寫為

max =(a>b) ? a : b;

執行該語句的語義是:如 a>b 為真,則把 a 賦予 max,否則把 b 賦予 max。使用條件表達式時,還應注意以下幾點:

1) 條件運算符的運算優先級低於關係運算符和算術運算符,但高於賦值符。 因此

max =(a>b) ? a : b; 可以去掉括號而寫為max = a>b ? a : b;

2) 條件運算符?和:是一對運算符,不能分開單獨使用。

3) 條件運算符的結合方向是自右至左。例如:

a>b?a:c>d?c:d 應理解為

a>b?a:(c>d?c:d)

這也就是條件表達式嵌套的情形,即其中的表達式 3 又是一個條件表達式。

【例 5.8】


用條件表達式對上例重新編程,輸出兩個數中的大數。

5.4 switch 語句

C語言還提供了另一種用於多分支選擇的 switch 語句, 其一般形式為:

其語義是:計算表達式的值。 並逐個與其後的常量表達式值相比較,當表達式的值與某個常量表達式的值相等時, 即執行其後的語句,然後不再進行判斷,繼續執行後面所有 case 後的語句。如表達式的值與所有 case 後的常量表達式均不相同時,則執行 default 後的語句。

switch(表達式){

case 常量表達式 1: 語句 1;

case 常量表達式 2: 語句 2;

case 常量表達式 n:

default

}

:

語句 n;

語句 n+1;

【例 4.9】


本程序是要求輸入一個數字,輸出一個英文單詞。但是當輸入 3 之後,卻執行了 case3 以及以後的所有語句,輸出了 Wednesday 及以後的所有單詞。這當然是不希望的。為什麼會出現這種情況呢?這恰恰反應了 switch 語句的一個特點。在 switch 語句中,"case 常量表達式"只相當於一個語句標號, 表達式的值和某標號相等則轉向該標號執行,但不能在執行完該標號的語句後自動跳出整個 switch 語句,所以出現了繼續執行所有後面 case 語句的情況。 這是與前面介紹的 if 語句完全不同的,應特別注意。為了避免上述情況,C語言還提供了一種 break 語句,專用於跳出 switch 語句,break 語句只有關鍵字 break,沒有參數。在後面還將詳細介紹。修改例題的程序,在每一 case 語句之後增加 break 語句, 使每一次執行之後均可跳出 switch 語句,從而避免輸出不應有的結果。

【例 4.10】


在使用 switch 語句時還應注意以下幾點:

1) 在 case 後的各常量表達式的值不能相同,否則會出現錯誤。

2) 在 case 後,允許有多個語句,可以不用{}括起來。

3) 各 case 和 default 子句的先後順序可以變動,而不會影響程序執行結果。

4) default 子句可以省略不用。

5.5 程序舉例

【例 4.11】輸入三個整數,輸出最大數和最小數。

本程序中,首先比較輸入的 a,b 的大小,並把大數裝入 max,小數裝入 min 中,然後再與 c 比較,若 max 小於 c,則把 c 賦予 max;如果 c 小於 min,則把 c 賦予 min。因此 max 內總是最大數,而 min 內總是最小數。最後輸出 max 和 min 的值即可。

【例 4.12】計算器程序。用戶輸入運算數和四則運算符,輸出計算結果。

本例可用於四則運算求值。switch 語句用於判斷運算符,然後輸出運算值。當輸入運算符不是+,-,*,/時給出錯誤提示。

5.6 本章小結

1.關係運算符及其優先次序參看 5.1.1 節

2.邏輯運算符及其優先次序參看 5.2.1 節

3. if 語句和條件表達式參看 5.3.3 節

4. 多分支選擇 switch 語句參看 5.4 節

關鍵字: