C語言函數(shù)

函數(shù)的基本概念

  • C源程序是由函數(shù)組成的
  • C語言不僅提供了極為豐富的庫函數(shù), 還允許用戶建立自己定義的函數(shù)。用戶可把自己的算法編寫成一個個相對獨立的函數(shù),然后再需要的時候調(diào)用它

函數(shù)的分類

  • 從函數(shù)執(zhí)行結(jié)果的角度來看, 函數(shù)可分為有返回值函數(shù)和無返回值函數(shù)兩種

    • 有返回值函數(shù): 此類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個執(zhí)行結(jié)果,稱為函數(shù)返回值。(必須指定返回值類型和使用return關(guān)鍵字返回對應(yīng)數(shù)據(jù))

    char test2(){
    return 'a';
    }

    • 無返回值函數(shù): 此類函數(shù)用于完成某項特定的處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值。(返回值類型為void, 不用使用return關(guān)鍵字返回對應(yīng)數(shù)據(jù))

void say(int age){
printf("age = %i\n", age);
}

  • 從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看,又可分為無參函數(shù)和有參函數(shù)兩種
    • 無參函數(shù): 在函數(shù)定義及函數(shù)說明及函數(shù)調(diào)用中均不帶參數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳送。

// 沒有參數(shù)的函數(shù)
void test(){
printf("test\n");
}

  • 有參函數(shù): 在函數(shù)定義及函數(shù)說明時都有參數(shù),稱為形式參數(shù)(簡稱為形參)。在函數(shù)調(diào)用時也必須給出參數(shù),稱為實際參數(shù)(簡稱為實參)

// 有參數(shù)的函數(shù)
int sum(int a, int b){
return a + b;
}

函數(shù)的定義

  • 定義函數(shù)的目的

    • 將一個常用的功能封裝起來,方便以后調(diào)用
      自定義函數(shù)的書寫格式

返回值類型 函數(shù)名(參數(shù)類型 形式參數(shù)1,參數(shù)類型 形式參數(shù)2,…) {
函數(shù)體;
返回值;
}

  • 示例

int main(){
printf("hello world\n");
retrun 0;
}

  • 定義函數(shù)的步驟
    • 函數(shù)名:函數(shù)叫什么名字
    • 函數(shù)體:函數(shù)是干啥的,里面包含了什么代碼
    • 返回值類型: 函數(shù)執(zhí)行完畢返回什么和調(diào)用者
  • 函數(shù)定義注意
    • 函數(shù)不能嵌套定義

void test() {
void test2() { // 錯誤寫法
}
}

  • 函數(shù)名稱不能相同

void test() {
}
void test() { // 報錯
}

函數(shù)的參數(shù)和返回值

  • 形式參數(shù)
    • 在定義函數(shù)時,函數(shù)名后面小括號()中定義的變量稱為形式參數(shù),簡稱形參
    • 形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。
    • 因此,形參只有在函數(shù)內(nèi)部有效,函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量


  • 實際參數(shù)
    • 在調(diào)用函數(shù)時, 傳入的值稱為實際參數(shù),簡稱實參
    • 實參可以是常量、變量、表達(dá)式、函數(shù)等,無論實參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參
    • 因此應(yīng)預(yù)先用賦值,輸入等辦法使實參獲得確定值


形參、實參注意點

  • 調(diào)用函數(shù)時傳遞的實參個數(shù)必須和函數(shù)的形參個數(shù)必須保持一致

int max(int number1, int number2) { // 形式參數(shù)
return number1 > number2 ? number1 : number2;
}
int main() {
// 函數(shù)需要2個形參, 但是我們只傳遞了一個實參, 所以報錯
max(88); // 實際參數(shù)
return 0;}

  • 形參實參類型不一致, 會自動轉(zhuǎn)換為形參類型

void change(double number1, double number2) {// 形式參數(shù)
// 輸出結(jié)果: 10.000000, 20.000000
// 自動將實參轉(zhuǎn)換為double類型后保存
printf("number1 = %f, number2 = %f", number1, number2);
}
int main() {
change(10, 20);
return 0;
}

  • 當(dāng)使用基本數(shù)據(jù)類型(char、int、float等)作為實參時,實參和形參之間只是值傳遞,修改形參的值并不影響到實參函數(shù)可以沒有形參

void change(int number1, int number2) { // 形式參數(shù)
number1 = 250; // 不會影響實參
number2 = 222;}
int main() {
int a = 88;
int b = 99;
change(a, b);
printf("a = %d, b = %d", a, b); // 輸出結(jié)果: 88, 99
return 0;
}

  • 返回值類型注意點
    • 如果沒有寫返回值類型,默認(rèn)是int

max(int number1, int number2) {// 形式參數(shù)
return number1 > number2 ? number1 : number2;
}

  • 函數(shù)返回值的類型和return實際返回的值類型應(yīng)保持一致。如果兩者不一致,則以返回值類型為準(zhǔn),自動進(jìn)行類型轉(zhuǎn)換

int height() {
return 3.14;
}
int main() {
double temp = height();
printf("%lf", temp);// 輸出結(jié)果: 3.000000
}

  • 一個函數(shù)內(nèi)部可以多次使用return語句,但是return語句后面的代碼就不再被執(zhí)行

int max(int number1, int number2) {// 形式參數(shù)
return number1 > number2 ? number1 : number2;
printf("執(zhí)行不到"); // 執(zhí)行不到
return 250; // 執(zhí)行不到
}

函數(shù)的聲明

  • 在C語言中,函數(shù)的定義順序是有講究的:
    • 默認(rèn)情況下,只有后面定義的函數(shù)才可以調(diào)用前面定義過的函數(shù)
  • 如果想把函數(shù)的定義寫在main函數(shù)后面,而且main函數(shù)能正常調(diào)用這些函數(shù),那就必須在 main函數(shù)的前面進(jìn)行函數(shù)的聲明, 否則
    • 系統(tǒng)搞不清楚有沒有這個函數(shù)
    • 系統(tǒng)搞不清楚這個函數(shù)接收幾個參數(shù)
    • 系統(tǒng)搞不清楚這個函數(shù)的返回值類型是什么
  • 所以函數(shù)聲明,就是在函數(shù)調(diào)用之前告訴系統(tǒng), 該函數(shù)叫什么名稱, 該函數(shù)接收幾個參數(shù), 該函數(shù)的返回值類型是什么
  • 函數(shù)的聲明格式:
    • 將自定義函數(shù)時{}之前的內(nèi)容拷貝到調(diào)用之間即可
    • 例如: int max( int a, int b );
    • 或者: int max( int, int );
  • 函數(shù)的聲明與實現(xiàn)的關(guān)系
    • 聲明僅僅代表著告訴系統(tǒng)一定有這個函數(shù), 和這個函數(shù)的參數(shù)、返回值是什么
    • 實現(xiàn)代表著告訴系統(tǒng), 這個函數(shù)具體的業(yè)務(wù)邏輯是怎么運作的
  • 函數(shù)聲明注意點:
    • 函數(shù)的實現(xiàn)不能重復(fù), 而函數(shù)的聲明可以重復(fù)
    • 函數(shù)聲明可以寫在函數(shù)外面,也可以寫在函數(shù)里面, 只要在調(diào)用之前被聲明即可
    • 當(dāng)被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時,在主調(diào)函數(shù)中也可以不對被調(diào)函數(shù)再作聲明
    • 如果被調(diào)函數(shù)的返回值是整型時,可以不對被調(diào)函數(shù)作說明,而直接調(diào)用

main函數(shù)

  • main的含義:
    • main是函數(shù)的名稱, 和我們自定義的函數(shù)名稱一樣, 也是一個標(biāo)識符
    • 只不過main這個名稱比較特殊, 程序已啟動就會自動調(diào)用它
  • return 0;的含義:
    • 告訴系統(tǒng)main函數(shù)是否正確的被執(zhí)行了
    • 如果main函數(shù)的執(zhí)行正常, 那么就返回0
    • 如果main函數(shù)執(zhí)行不正常, 那么就返回一個非0的數(shù)
  • 返回值類型:
    • 一個函數(shù)return后面寫的是什么類型, 函數(shù)的返回值類型就必須是什么類型, 所以寫int
      形參列表的含義
    • int argc :
      • 系統(tǒng)在啟動程序時調(diào)用main函數(shù)時傳遞給argv的值的個數(shù)
    • const char * argv[] :
      • 系統(tǒng)在啟動程序時傳入的的值, 默認(rèn)情況下系統(tǒng)只會傳入一個值, 這個值就是main函數(shù)執(zhí)行文件的路徑
      • 也可以通過命令行或項目設(shè)置傳入其它參數(shù)

遞歸函數(shù)(了解)

  • 什么是遞歸函數(shù)?

    • 一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用
  • 遞歸函數(shù)構(gòu)成條件

    • 自己搞自己
    • 存在一個條件能夠讓遞歸結(jié)束
    • 問題的規(guī)模能夠縮小
  • 示例:

    • 獲取用戶輸入的數(shù)字, 直到用戶輸入一個正數(shù)為止


  • 遞歸和循環(huán)區(qū)別

    • 能用循環(huán)實現(xiàn)的功能,用遞歸都可以實現(xiàn)
    • 遞歸常用于"回溯", "樹的遍歷","圖的搜索"等問題
    • 但代碼理解難度大,內(nèi)存消耗大(易導(dǎo)致棧溢出), 所以考慮到代碼理解難度和內(nèi)存消耗問題, 在企業(yè)開發(fā)中一般能用循環(huán)都不會使用遞歸
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù)基本概念 C源程序是由函數(shù)組成的例如: 我們前面學(xué)習(xí)的課程當(dāng)中,通過main函數(shù)+scanf函數(shù)+printf...
    極客江南閱讀 1,744評論 1 14
  • 1、c語言的函數(shù)有以下特點: (1)才源程序由函數(shù)組成,一個主函數(shù)main()+若干其他函數(shù) C程序中的函數(shù)類似文...
    滕王閣序閱讀 1,510評論 0 6
  • C語言函數(shù)(一) 謹(jǐn)記 短暫的人生中,注定有很多人陪伴著你度過,陪你一起歡呼,陪你一起傷心流淚,陪你一起走過一條又...
    長風(fēng)留言閱讀 2,418評論 1 7
  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,957評論 1 19
  • 本文是小結(jié)了一下C語言的函數(shù)語法,詳細(xì)介紹了C語言函數(shù)語法的概述、函數(shù)的定義、函數(shù)的返回值、函數(shù)調(diào)用等7個方面的內(nèi)...
    踩在浪花上00閱讀 1,689評論 0 3

友情鏈接更多精彩內(nèi)容