二、函式定義及宣告
總結這一節簡單地介紹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是整張表的起始位址(類似於陣列的其起始位址)。這時再看上面那個關於default的問題。接著對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前面的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.程式這次執行正常下次執行...