C語言學習記錄(三) Switch 函式定義

2021-10-24 15:26:00 字數 3120 閱讀 4313

二、函式定義及宣告

總結這一節簡單地介紹c中兩個基礎語法

1. if…else…的替代方法:switch…case…

2. 函式function的定義及宣告

swich是一種選擇語法,使用場景是針對不同情況需要做出不同操作。因此它可以代替某些if…else…語句。當不同情況數較多時,就會體現出switch的優勢。

我們直接看一段**來掌握其語法

#include

intmain

(int argc,

char

*ar**)

int i =0;

for(i =

0; ar**[1]

[i]!=

'\0'

; i++

)break

;default

:// letter取其他值時,執行的程式段

printf

("%d: %c is not a vowel\n"

, i, letter);}

}return0;

}

輸入及執行結果如下:

$ .

/ex13 aaeok

0: 'a'

1: 'a'

2: 'e'

3: 'o'

4: k is not a vowel

從程式中我們提取出關鍵資訊:

switch()的括號中是可以取不同值的變數(必須是廣義上的整數,比如字母或者結果為整數的布林表示式),緊跟在case後面的值是該變數可能的不同取值,case下面的程式段是變數正好等於該值時,要執行的程式;

default指無論何值都可以執行的程式。看到這裡可能有個疑問,從程式執行結果看default後面的程式,是在letter不取前面case中的任何值時才會執行,怎麼能說無論何值都會執行呢?

這個問題的答案關鍵在break。我們通過switch的執行原理可以獲得答案。

switch實際上是乙個跳轉表,switch(a)這句話就定義了乙個跳轉表的起始位置,並且要將這個起始位址加上a的值(因此a必須是整數),得到要跳轉到的目的位址。

如果這個目的位址等於下面某個case代表的目的位址,就跳轉到這個case處繼續向下執行程式。

這時注意:如果沒有break,這個程式就從當前case處,一直向下執行。會把下面的case帶的**也執行一遍。因此要使用break來進行隔斷!這樣才能保證只執行某個case處的**。

以上面**為例具體解釋跳轉表的跳轉過程:

編譯器會標記swicth語句的頂端,我們先把它記為位址y。y是整張表的起始位址(類似於陣列的其起始位址)。

接著對switch中的表示式求值,產生乙個數字。在上面的例子中,數字為ar**[1]中字母的原始的ascll碼。

編譯器也會把每個類似case 'a』的case**塊翻譯成這個程式中距離語句頂端的位址,所以case 『a』就在*(y + 『a』)處。

接著計算是否y+letter位於switch語句中,如果距離太遠則會將其調整為y+default。

一旦計算出了位址,程式就會「跳」到**的那個位置並繼續執行。這就是一些case**塊中有break而另外一些沒有的原因。

如果輸出了』a』,那它就會跳到case 『a』,它裡面沒有break語句,所以它會貫穿執行底下帶有**和break的case 『a』。

最後它執行這段**,執行break完全跳出switch語句塊。

這時再看上面那個關於default的問題。

如果default前面的case都不帶break,那麼default後面的**一定會被執行,它之所以不會被執行,就是因為前面的break!所以說default是變數無論取何值都可以執行的程式。

定義時按照下面的格式:

返回值資料型別  函式名(資料型別 引數1, 資料型別 引數2,...)

函式體包含宣告部分和語句部分,宣告部分用於宣告及初始化函式中用到的變數,語句部分就是執行運算等其他操作的語句。

舉乙個函式定義的栗子(雖然定義了這麼多函式,最終執行的仍是主函式main哦~)

#include

#include

// forward declarations

intcan_print_it

(char ch)

;void

print_letters

(char arg)

;void

print_arguments

(int argc,

char

*ar**)

}void

print_letters

(char arg)

}printf

("\n");

}int

can_print_it

(char ch)

intmain

(int argc,

char

*ar**)

其中下面這兩行是提前宣告函式的語句。就是把要宣告的函式,其定義引數的那行複製一遍就行。

int

can_print_it

(char ch)

;void

print_letters

(char arg)

;

為什麼需要提前宣告?

可以看到,在下面的程式中,函式print_arguments先被定義,函式體中用到了函式can_print_it和print_letters;然而這兩個函式在後面才被定義,因此為了不報錯,我們需要在定義print_arguments前,宣告這兩個函式。

如果我們最後定義函式print_arguments,就不需要提前宣告了。

1、switch的本質是跳轉表;

2、switch用法中的break很重要,可以用它來實現 if(*** || ***)的邏輯,或者其他更複雜的操作;

3、使用自定義函式時,注意是否需要提前宣告。

C語言學習7(switch語句)

switch語句 switch語句 注意格式 switch 表示式 表示式只能為整型 字元型 列舉型,case語句中的表示式也一樣!特殊用法 此用法適用於不同的資料得到相同的結果的情況.switch 表示式 表示式只能為整型 字元型 列舉型,case語句中的表示式也一樣!例項4 5 成績查詢 在查成...

C語言學習(三)

程式的模組化設計 程式設計練習 課外話 挫折是人生的常態,在我們遭遇疫情,不應一味放大痛苦讓其充塞心靈。我們要學會調適心弦,坦然面對,全國人民團結一致,就一定會戰勝疫情。祖國加油 武漢加油 你的答案 陣列程式的模組化設計 所謂陣列,是有序的元素序列。1 若將有限個型別相同的變數的集合命名,那麼這個名...

C語言學習要點記錄

1.運算的優先順序 算數 關係 邏輯 賦值 逗號運算子 2.複製是程式不良的表現 因為一旦乙個地方有變動要在很多地方修改 3.程式設計的過程中最好使用單一出口 4.本地變數在定義的時候不會預設初始化,引數在定義的時候一定要初始化 5.本地變數的生存期和作用域在定義的塊內 6.程式這次執行正常下次執行...