C語言基礎:函數參數與返回值

在本節中我們來詳細講述一下函數的參數表與返回值。在定義一個函數時我們就需要確定這個函數的參數表及返回值。

一、參數表

參數表就是我們在調用這個函數時對它的輸入內容,通過對函數的輸入,使得函數在不同輸入的情況下有著不同的輸出,也就是返回值。例如我們定義一個用於計算兩個變數之和的函數:

int plus(int a, int b){ return a + b;}int main(int argc, char *argv[]){ int c = 3, d = 5; int e = add(c, d); printf("%d
", c, e); return 0;}

我們在定義函數時為函數定義了兩個參數,a和b,而在調用它時給這個函數傳入了兩個變數c和d。其中a和b為函數的形式參數,而c和d是函數調用的實際參數。也就是說當函數被調用時,c的值傳遞給了a,d的值傳遞給了b,所以a的值為3,b的值為5。而在函數體中,函數將計算3與5的和,並通過返回語句return將結果返回。

函數的實際參數只是將變數的值傳遞到了函數中,函數將值保存到形式參數中,並使用這些變數。而在函數內部修改形式參數的值,並不會影響到函數外部的實際參數,例如:

int wrongplus(int a, int b){ a++; b++; return a + b;}int main(int argc, char *argv[]){ int c = 3, d = 4; int e = wrongplus(c, d); printf("%d
", c, e); return 0;}

上面例子中主函數main中定義的兩個變數a和b是實際參數,而wrongplus中參數表中的a和b是是形式參數,在函數內部對形式參數做修改並不會影響到外部的實際參數,所以在函數內部的a和b的值分別為4、6,而函數外部的a和b的值仍然為3、5。

二、函數的返回值

函數的返回值就是當這個函數被調用執行結束之後向函數調用者返回的一個結果。注意,與參數表不同,一個函數可以有多個輸入參數,但只能有一個返回結果。

函數需要用return語句來定義其返回值,return語句後的表達式將作為函數的返回值,而這個值必須要與定義函數時的返回值類型一致。例如我們來定義一個計算並返回三個變數中較大值的函數:

int max(int a, int b, int c){ int m; if (a > b && a > c) { m = a; } else if (b > a && b > c) { m = b; } else { m = c; } return m;}int main(int argc, char *argv[]){ printf("%d
", max(1, 5, 6)); return 0;}

注意,當return語句執行之後,當前函數也就執行結束了。當前函數體中return語句後面的程序將不會被執行。

另外,我們在函數體內部定義的變數max只在函數的內部有效,而在函數外部是無法使用函數內部定義的變數的。關於變數的生存周期我們將在後續章節中學習。

我們把上面程序做一些修改:

int max(int a, int b, int c){ if (a > b && a > c) { return a; } if (b > a && b > c) { return b; } return c;}

三、無參函數與無返回值函數

函數可怕被定義成無參數類型或是無返回值類型的。當函數沒有參數表是,可以使用void關鍵字來對函數的參數表做定義。當函數沒有返回值時,也可以通過void來定義函數的返回值類型。例如:

float pi_value(void){ return 3.141562654;}void display_value(int v){ printf("%d
", v);}

同樣我們還可以定義一個即無參數表也無返回值的函數:

void hello(void){ printf("Hello World!
");}

另外,當沒有參數表時,小括弧中的void可以省略,例如:

void hello(){ printf("Hello World!
");}

歡迎關注公眾號:編程外星人

推薦閱讀:

編程中所講的「思維深度」的本質是什麼?
工作一個月的感受

TAG:編程 | C編程語言 |