成為C++高手之函式
什麼是函式
我們寫的是程式,程式裡要有計算機能執行的指令,指令也叫程式碼。
程式碼放在哪裡呢?寫程式的時候,程式碼不能隨便放,必放在函式裡面。比如我們可以看到main這個函式,大括號裡就是程式碼。
系統啟動我們的程式後,首先執行的就是main函式裡的程式碼。
函式並不是你寫好了,它裡面的程式碼就被執行,而是需要呼叫。執行一個函式的程式碼,叫做呼叫一個函式。
main函式裡輸出hello world就是呼叫了printf這個函式,而main函式是被系統呼叫的。
main函式叫入口函式,每個程式中main函式必須存在且唯一,絕不能再有第二個叫main的函式。main就是程式的大門,沒有門的程式怎麼能執行呢?
printf函式
輸出文字就是printf函式乾的,它是向控制檯輸出文字。它有更高階的功能:格式化輸出文字。請思考以下問題:輸出兩個數相加等於和的形式,比如“5+6=11”的形式,怎麼寫?很簡單,可以把算式直接寫在字串裡:
printf("5+6=11!\n");
那麼,如果要輸出55+6; 66+44; 33334234+90509435……我們總不能每個都自己算出它們的和,然後寫成字串吧?大家知道計算機是可以對數進行四則運算的。為什麼不利用起來呢?但是如果把加法運算寫到字串裡,計算機就不給算了。 要怎樣才能讓printf把和計算出來然後輸出呢?只需要加一些“格式化標記”,比如字串中要顯示結果的位置,可以用一個“%d”表示這個位置要有一個整數,這個整數從哪裡來呢,就要通過引數傳進去:
printf("5+6=11!\n");
printf("5999+6767=%d!\n",5999+6767);
printf("%d+%d=%d!\n",5999,6767,5999+6767);
可以看到把計算寫到引數的位置了。執行printf函式時,先執行加法運算,再把其結果當作引數傳給printf。
可以看到三條語句的不同,一條比一條智慧。
每個格式化標記必須對應一個引數,而且是跟據位置一一對應的。
也可以看到printf函式有個特點:引數數量可變。這是一種特殊的函式,大部分函式的引數數量是不可變的。
格式化標誌的作用一是佔位,二是表示瞭如何去解釋對應的引數,%d表示當作整數,%f表示當作浮點數,至於更多的格式化標誌,請自行上網查詢“printf輸出格式”。
自定義函式
程式裡面當然不能只有一個main函式,只在main函式裡寫所有程式碼,否則大程式的main函式會非常大,沒法看了。可以定義任意數量的其它函式。定義函式四要素:返回值型別、名字、引數、程式碼。寫一個最簡單的函式:
void func(){printf(“我是func”);}
這個函式雖然簡單,但是四要素俱全,void是返回型別,void表示沒有返回值,但不可省略;func是函式名,小括裡是引數,當然這個沒有引數,大括號裡是函式體,只有一句。
可以定義任意數量的函式。函式可以隨意呼叫其它函式(當然要符合程式邏輯的前提下),也可以自己呼叫自己(這叫遞迴,很危險)。但不要呼叫main函式啊!
引數的作用
通過printf函式可以體會一下引數的作用:給它傳入不同的引數,就打印出不同的字串。我們寫一個自定義函式吧:兩個數相加返回和,如果不用引數,函式是這樣的:
int add(){
return 234543+6346555;
}
不同的數相加要寫不同的函式才行。但這顯然太弱智了。而用引數後,變成這樣:
int add(int a,int b){
return a+b;
}
此函式可以被多次呼叫,計算不同數的和:
int he1 = add(33454,8888);
int he2 = add(909090,3234);
函式重用性提高了。引數儲存了呼叫函式時傳入的值。函式內可以變化的資料,就應該用引數傳進來,這樣一來函式的程式碼固定了,但卻可以處理不同的資料。
函式定義時的引數叫形參,呼叫函式時傳入的引數值叫實參,實引數量必須與形參一致並且位置一一對應並且型別相符。
函式定義與宣告一定要嚴格區分,定義函式時,帶有函式體(大括號),宣告函式時,不帶函式體。宣告函式時,引數用不到,所以可以省略引數名。
函式宣告就是說明函式長什麼樣,編譯器就可以檢查函式呼叫的地方語法對不對(實引數量對嗎?引數型別對嗎?接收返回值的變數型別對嗎?等等)。
前置宣告:A函式呼叫B函式,B函式必須在A函式上面定義。如果B在A下面定義,編譯器會報錯,說找不到B函式,可以把B函式的宣告放在A函式上面,這樣就OK了。
注意:定義會使函式有實體存在,執行時佔用記憶體,而宣告不會。
什麼是變數
函式儲存程式碼,變數儲存資料。
定義一個變數的語法有三要素:型別,名字,初始值。
初始值很重要。雖然賦初始值不算錯誤,但其實很危險。可能會引起執行時的邏輯錯誤,這種錯誤更難找。
變數也分宣告和定義。宣告變數時,在變數型別前帶關鍵字:extern,而且不能有初始值(當然不能有了,宣告只是說明一個變數長什麼樣,並不會使變數實體存在)。
變數定義後會在記憶體中的某個位置佔據一塊區域。這塊區域的大小由變數的型別決定。
變數的型別有:char,short,int,long,float,double,指標,結構等,具體的自己上網查吧。