程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 深入理解C語言-06-邏輯控制

深入理解C語言-06-邏輯控制

編輯:關於C語言

C語言的邏輯控制主要有7種:

1> goto 最強大,但一般只在特殊環境下使用。

2> if else

3> ?:

4> switch case

5> for

6> while

7> do while


自從dijkstra的論文Go To Statement Considered Harmful以後,C語言代碼很少看到goto了。(一般用在多次資源分配的錯誤處理上)

但,從計算機的角度來說,缺少goto(jmp指令)還真沒法干活。其實,goto是最符合我們的設計流程圖的。

將一個流程圖用goto來實現也最直觀。goto能真正讓我們做到心之所動,劍之所至。


接下來,分別考慮將2-7轉化為對應的goto語言版本(等價於轉化為對應匯編版本)。

2 if語句

if (條件1)

代碼塊1

else

代碼塊2

對應goto:

t = 條件1;

if (t為真)goto true;

代碼塊2

goto finish

true:

代碼塊1

finish:


3 ?: 和if else是等價的。

只不過if語句為代碼塊,?:為表達式。

變量= (條件1)? 表達式1:表達式2;

goto版本:

t = 條件1;

if (t為真)

goto true;

變量=表達式2

goto finish;

true:

變量=表達式1

finish:

注意:?:裡面的表達式盡量簡單,過於復雜的話,改用if語句實現,這樣方便調試。

4 switch-case

switch (條件取值變量)

case 元素1 :

語句塊1;

break;

case 元素2:

語句塊2;

break;

...

case 元素N

語句塊N;

break;

default:

默認處理。

break;

}

goto版本:

跳轉表={標簽1,標簽2,...,標簽N }

goto 跳轉表[元素index]

標簽1:

語句塊1

goto Finish

標簽2:

語句塊2

goto Finish

...

標簽N:

語句塊N

goto Finish

default:

默認處理。

Finish:

5> for

for (初始化語句;判斷語句;迭代語句)

循環語句塊

goto版本:

初始化語句;

if (判斷語句為否)

goto Finish;

loop:

循環語句塊

迭代語句

if (判斷語句為真)

goto loop;

Finish:

6> while

while(條件為真)

代碼塊

迭代塊

對應goto版本:

loop:

t = 條件

if (不為真) goto Finish;

代碼塊

迭代塊

Finish:

7> do-while

do {

語句塊1

迭代塊1

} while (條件為真)

goto版本:

loop:

語句塊1

迭代塊1

if (條件為真) goto loop;

C語言的goto同匯編語句jmp系列指令邏輯上是完全一致的。


注意:

1> 關於條件,有個經典的邏輯代數公式:

摩根公式:

!(A && B) = (!A) || (!B)

建議,對復雜邏輯,手動畫代數運算表

A B 結果

0 0 ?

0 1 ?

1 0 ?

1 1 ?

並保證單體測試的全覆蓋。

2> 邏輯操作和位操作是2組,需要區分開來。

與 或 反

邏輯: && || !

位: & | ~ ^ (異或)

3 強烈推薦在寫代碼前,在紙上畫完整的流程圖,梳理自己的設計思路。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved