原文: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的 片段具有較高的難度。這一章中,我們會建立乙個非常小型的測試 框架 並且使用你的框架目錄構建測試用例的示例。我接下來打...