笨辦法學C 練習13 Switch語句

2021-09-19 08:42:49 字數 1777 閱讀 7541

原文:exercise 13: switch statement

譯者:飛龍

在其它類似ruby的語言中,switch語句可以處理任意型別的表示式。一些語言比如python沒有switch語句,因為帶有布林表示式的if語句可以做相同的事情。對於這些語言,switch語句比if語句更加靈活,然而內部的機制是一樣的。

c中的switch語句與它們不同,實際上是乙個「跳轉表」。你只能夠放置結果為整數的表示式,而不是一些隨機的布林表示式,這些整數用於計算從swicth頂部到匹配部分的跳轉。下面有一段**,我要分解它來讓你理解「跳轉表」的概念:

#include int main(int argc, char *ar**)

int i = 0;

for(i = 0; ar**[1][i] != '\0'; i++)

break;

default:

printf("%d: %c is not a vowel\n", i, letter);}}

return 0;

}

在這個程式中我們接受了單一的命令列引數,並且用一種極其複雜的方式列印出所有原因,來向你演示switch語句。下面是swicth語句的工作原理:

譯者注:更常見的情況是,gcc會在空白處單獨構建一張跳轉表,各個偏移處存放對應的case語句的位址。y不是switch語句的起始位址,而是這張表的起始位址。程式會跳轉到*(y + 'a')而不是y + 'a'處。

這是對swicth語句工作原理的乙個深究,然而實際操作中你只需要記住下面幾條簡單的原則:

下面是我執行它的乙個例子,也演示了傳入命令列引數的不同方法:

$ make ex13

cc -wall -g ex13.c -o ex13

$ ./ex13

error: you need one argument.

$$ ./ex13 zed

0: z is not a vowel

1: 'e'

2: d is not a vowel

$$ ./ex13 zed shaw

error: you need one argument.

$$ ./ex13 "zed shaw"

0: z is not a vowel

1: 'e'

2: d is not a vowel

3: is not a vowel

4: s is not a vowel

5: h is not a vowel

6: 'a'

7: w is not a vowel

$

記住在**的開始有個if語句,當沒有提供足夠的引數時使用return 1返回。返回非0是你提示作業系統程式出錯的辦法。任何大於0的值都可以在指令碼中測試,其它程式會由此知道發生了什麼。

破壞乙個switch語句塊太容易了。下面是一些方法,你可以挑乙個來用:

你也可以使用一些別的方法使這個程式崩潰。試著看你能不能自己做到它。

笨辦法學C 練習0 準備

原文 exercise 0 the setup 譯者 飛龍 在這一章中,你將為c語言程式設計配置好你的系統。乙個好訊息是對於所有使用linux或者mac的人,你的系統是為c語言程式設計而設計的。c語言的創造者也對unix作業系統的創造做出了貢獻,並且linux和osx都是基於unix的。事實上,安裝...

笨辦法學python習題24更多練習

首先祝大家新年快樂,在新的一年裡事事順利,步步高公升。上一章的習題書中讓我找的 確實找不到,我也就放棄了,直接跳到這一章,開始吧 這次的函式和前面幾章的有些不同,這裡的函式在函式體中存在三個變數,返回值是將三個變數的值賦給另外三個變數,感覺我這描述好白化啊,還是專業知識不夠啊。附加練習 1.記得仔細...

笨辦法學C 練習30 自動化測試

原文 exercise 30 automated testing 譯者 飛龍 自動化測試經常用於例如python和ruby的其它語言,但是很少用於c。一部分原因是自動化載入和測試c的 片段具有較高的難度。這一章中,我們會建立乙個非常小型的測試 框架 並且使用你的框架目錄構建測試用例的示例。我接下來打...