本節開始說函數。
一、函數的基本用法
/* 作用:可以實現代碼的復用,在一定程度上解決代碼冗余的問題;方便后期維護。 語法: void 函數名(){ 函數體; } 函數命名要有意義,遵守駝峰命名法。起名要有意義,要做到看到函數名就知道函數體有什么作用。 */ //例如: void printfMsg(){ printf("哈哈哈哈。"); } int main(int argc,const char * argv[]){ printfMsg(); return 0 ; }
二、帶參數的函數
/* 帶一個參數的函數: 語法: void 函數名(類型 形參名){ 函數體; } */ //例如: void printfNumber(int num){ printf("傳入的參數為:%d \n",num); } int main(int argc , const char * argc[]){ printfNumber(30); return 0; } /* 帶多個參數的函數: 語法: void 函數名(類型 形參名1,類型 形參名2){ 函數體; } */ //例如: void printfNumber(int num1,int num2){ printf(" %d * %d = %d \n",num1,num2,num1*num2); } int main(int argc , const char * argc[]){ printfNumber(30,10); return 0; } /*傳多個以此類推。*/
注意:1、函數如果有參數,調用該方法的時候,必須按照對應的順序和個數給它傳參數,否則會報錯。
2、函數的形參相當於在函數內部定義的局部變量,所以就不能在該方法中定義同名變量。
3、調用函數的時候,給它傳遞參數,就相當於給形參賦值,如果形參和傳參都是基本數據類型,當類型不匹配的時候,會發生強制轉換。
引出兩個概念。
形參:函數內定義的變量。
實參:調用函數時傳過去的值。
注意:當函數的參數是基本數據類型的時候,在函數里改變了形參的值,不會影響到實參。
三、帶返回值的函數
/* 比如:寫一個函數來計算兩個數字的加減乘除的結果,直接在函數中輸出,這樣做有點不太合適,也有點怪怪的,所以就需要函數給我們一個返回值。 語法: 返回值類型 函數名(參數列表){ 函數體; return 返回值; } 注意:1、如果函數有返回值,可以選擇接收和不接收,不會影響函數的執行。 2、如果返回值是基本數據類型,在接收的時候,可以使用其他基本數據類型的變量來接收,但是會發生強制轉換,所以不推薦這樣做。 3、在基本數據類型中,返回值的類型可以和函數定下的返回值類型不同,但是也會發生強制轉換,不推薦這樣做。 4、如果 函數需要返回值,必須保證每條分支都有返回值。 */ //例如: int addNum(int num1 ,int num2){ int result = num1+num2; return result; } int isONum(int num ){ if(num%2==0){ return num; }else if(num %2 >0){ return num; }else{ //如果不加一個else的話,程序會報錯,程序不會分析你的邏輯。 return num; } } int main (int argc ,const char * argc[]){ int result= addNum(10,14); printf("兩數之和為:%d \n",result); return 0; }
上面用到了return關鍵字,這里來介紹下return。
/* return: 1、 在有返回值的函數里,return可以幫值返回出去。 2、如果函數沒有返回值,也可以用return,但是return后面不能帶值,否則會報錯。 3、可以結束循環。 作用:結束函數。 */
四、函數的注意事項
/* 1、函數內部不可以定義其他函數,但是可以聲明。 2、函數可以調用其他的函數。 3、函數不允許重名。 4、編譯器是自上而下編譯的,所以在調用自定義函數時,需要把自定義函數寫在main函數上方,如果想寫在下面,則需要先聲明。 聲明的注意事項: 1、函數的聲明可以卸載任意位置,但是必須要在調用該函數之前。 2、函數的聲明可以寫n個。 3、聲明函數的時候,形參名可以省略。 4、函數返回值是int時,可以不用聲明(僅限mac),所以推薦任何函數,都先聲明。 5、聲明函數的時候,最好和原函數頭一樣,推薦直接復制函數頭,刪掉大括號加上分號就可以了。。 */ //例如: int main(int argc,const char * argv[]){ void test();//這句話是告訴編譯器,我有這個方法,只不過在下面了。這樣編譯器就不報錯,當然你下面沒有這個函數編譯器也不會報錯。 test(); void test1(int ); test1(10); return 0; } void test(){ printf("咩哈哈哈"); } void test1(int Num){ printf("咩哈哈哈"); }