C Primer Plus(九) 函數

聲明:這只是讀書筆記和總結

1.C的設計原則是把函數作爲程序的構成模塊。
9.1函數概述:
函數是用於完成特定任務的程序代碼的自包含單元。
函數省去重複代碼的編寫
函數是的程序更加程序化
黑盒子觀點。
9.1.1
函數原型,函數使用,函數定義
函數原型的聲明只要在函數使用之前就可以

9.1.2

#include<stdio.h>
//void imin(int ,int);  //一般的形式都是放在主函數之前。
int main(void){
    void imin(int ,int);//放在這也可以 ,分號的使用表示該語句爲函數聲明語句
}

有些老版本編譯器不支持的是void類型,新的編譯器支持void類型。
當計算機執行到子函數時,控制權就由主函數變成了子函數,只有當子函數執行完成以後,纔可以把控制權返回。
定義函數中的變量爲局部變量,只能在子函數中使用,主函數定義相同的變量名互不關聯。
9.1.3
形式參量:定義函數時所使用的變量,爲子函數私有。

void dibs(int ,int)
void dibs(int x,y,z);//error
void dibs(int x,int y,int z)//ture
void dibs(a,b)
int a;
int b;              //ture,這是ANSI之前的標準

9.1.4
實際參量是調用函數分配給被調函數變量的特定值。
把子函數當做爲一個黑盒子,做好必要的註釋。
9.1.5
return:

#include <stdio.h>
int imin(int a,int b);

void main(void){
    int a = 1,b = 2 ,c = 0;
     c = imin(a,b);
}
int imin(int a,int b){
    if(a < b)
        return a;
    if(a>b)
        return b;  //返回最小值,c = imin(a,b)turn 
}

當返回值與函數的返回值類型不對是,以函數的類型返回值爲標準。
return的另一個作用就是終止函數,把控制權交給上一級函數。
9.1.6
函數的類型。在我們寫C語言的時候,我們會在開頭加入頭文件eg:#include

int imin();
void main(void){
}
int min()
int a,b;
{
    if(``)
    else
}

如果函數使用的時候錯誤的輸入了參數個數,編譯器並不會報錯,但是會有一個錯誤的答案。
運行機制在PC和VAX中:
調用函數首先把參數放在一個稱作堆棧的臨時存儲區域,然後被調函數從堆棧中讀取這些參數····
ANSIC的解決方案:
在函數聲明的時候同時說明所使用的參數類型。
如果使用函數參數太多或太少就會報錯。
如果參數的類型錯誤並不會報錯,只會出現一個警告,進行類型轉換。

無參數和不確定參數:
無參數時會在括號內寫上空的數據類型
void imin(void)

對於不確定參數如printf(“”);
使用下面的原型聲明:printf(char *,…);
這種原型參數表示第一個參數爲一個字符串,而其他的參數不能確定。
C通過stdarg.h的頭文件提供了定義該類函數的標準方法。
函數原型的優點:可以更好地發現錯誤,還有使用的更加方便。


9.3遞歸:
C允許一個函數調用它自身。這種調用過程叫做遞歸。需謹慎處理
eg:

#include<stdio.h>
void up_and_down(int);
int main(void) { 
    up_and_down(1);
    return 0;   
} 
void up_and_down(int n){
    printf("LEVEL %d : n Location %p\n",n,&n);/*1*/
    if(n < 4){
        up_and_down(n + 1);
    }  
    printf("LEVEL %d : n location %p\n",n,&n);/*2*/
}

**結果:
LEVEL 1 : n Location 00000000009FFE30
LEVEL 2 : n Location 00000000009FFE00
LEVEL 3 : n Location 00000000009FFDD0
LEVEL 4 : n Location 00000000009FFDA0
LEVEL 4 : n location 00000000009FFDA0
LEVEL 3 : n location 00000000009FFDD0
LEVEL 2 : n location 00000000009FFE00
LEVEL 1 : n location 00000000009FFE30**

程序分析:
首先主函數調用了up_ang_down(1);
先執行1,此時n == 1;
然後調用自身,n == 2;
在執行1;此時n == 2;
然後調用自身,n == 3;
在執行1,此時n == 3;
然後調用自身,n == 4;
在執行1,此時n == 4;

在執行第四次,n == 4;
然後執行2,n == 4;
在執行第四次,n == 3;
然後執行2,n == 3
在執行第四次,n == 2;
然後執行2,n == 2
在執行第四次,n == 1;
然後執行2,n == 1

要上課了,明天繼續!

發佈了42 篇原創文章 · 獲贊 28 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章