菜鳥問與答 函式

2021-04-02 10:21:38 字數 4111 閱讀 2935

1、什麼是函式

在c語言中,完成乙個特定任務的程式段、子程式稱作函式,在乙個完整的c程式中,通常是由很多個函式組成的,每乙個函式完成其指定的任務。

2、什麼是函式原型

乙個函式有函式名、函式的返回值及返回值的型別、函式的引數及引數的型別。對函式的所有這些特徵予以描述稱作函式的原型。函式原型一般放在整個程式檔案的開始部分(內部函式)。對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔必須包含這個標頭檔案。

3、什麼是函式的返回值

當乙個函式執行完之後傳遞給呼叫函式乙個值,稱為返回值。是否需要返回乙個值給呼叫函式,具體情況視程式中的需要而定,有時根本就不需要返回乙個值給呼叫函式。

4、為什麼要說明函式的原型

函式原型能告訴編譯程式乙個函式接受什麼樣的引數,將返回什麼樣的返回值,這樣編譯程式就能檢查對函式的呼叫是否正確,是否存在錯誤的型別轉換。例:

int some_func(int,char *,long);

編譯程式應會檢查所有對該函式的呼叫(包括該函式的定義)是否使用了三個引數並且返回乙個int型別的值。如果編譯程式發現函式的呼叫或定義與函式原型不匹配,編譯程式應會報告出錯或警告資訊。例如對上述函式原型來說,當編譯程式檢查以下語句時,就會報告出錯或警告訊息:

x=some_func(1);       /*引數個數少*/

x=some_func("hello!",1,"dude!");   /*引數型別錯誤*/

x=some_func(1,str,2879,"t");       /*引數太多*/

下面的函式呼叫同樣是不正確的,因為函式some_func()的返回值不是乙個long *型別的值。

lvalue=some_func(1,str,2879);   /*函式返回值應該是int而不是long型。*/

同樣編譯程式還能檢查函式的定義(或函式體)是否與函式原型匹配。例如當編譯程式檢查以下函式定義時,應會報告出錯或警告資訊:

int some_func(char * string,,long lvalue,int ivalue)   /*引數的位置不對*/

總之,在原始檔中說明函式原型提供了一種檢查函式是否被正確引用的機制。目前許多流行的編譯程式都會檢查被引用的函式的原型是否已在原始檔中說明過,如果沒有,就會發出警告資訊。

5、乙個函式可以有多少個引數

乙個函式的引數的數目沒有明確的限制,但是引數過多(例如超過8個)顯然是一種不可取的程式設計風格。引數的數目直接影響到呼叫函式的速度,引數越多,函式呼叫越慢。另一方面,函式的引數少,程式就顯得精練、簡捷,這有助於檢查和發現程式中的錯誤,因此通常應該儘量減少引數的數目,如果乙個函式的引數超過4 個,就應該考慮一下函式是否編寫得當。如果乙個函式不得不使用很多引數,可以定義乙個結構來容納這些引數,這是一種非常好的解決辦法。

在下例中,函式print_report()需要使用10個引數,然而在它的引數說明中並沒有列出這些引數,而是通過乙個rpt_parms的結構得到這些引數。

#include

typedef struct

rpt_parms;

int print_report(rpt_parms *);

void main(void)

int print_report(rpt_parms *p)

上例唯一不足的是編譯程式無法檢查引用print_report()函式時rpt_parms結構的10個成員是否符合要求。

6、什麼是內部函式

內部函式用static來說明,是作用域只限於說明它的原始檔的函式。作用域指的是函式或變數的可見性。如果乙個函式或變數在說明它的原始檔以外也是可見的,那麼就稱它有全域性或外部作用域果乙個函式或變數在說明它的原始檔中是可見的,那麼就稱它具有區域性或內部作用域。

內部函式只能在說明它的原始檔中使用。如果你呈希望乙個函式不會在說明它的原始檔以外被使用,就應該將它說明為內部函式,這樣做是乙個好的程式設計習慣,因為這樣可以避免與其它原始檔中的同名函式發生衝突。

例:#include

int open_customer_table(void);

static int open_customer_indexes(void);

int open_customer_table(void)

return ret_code;

}static int open_customer_indexes(void)

在上例中,函式open_customer_table()是乙個外部函式,它可以被任何模組呼叫,而函式open_customer_indexes()是乙個內部函式,它永遠不會被其它模組呼叫。之所以這樣說明這二個函式,是因為函式open_customer_indexes()只需被函式open_customer_table()呼叫,即只需在上例的原始檔中使用。

7、如果乙個函式沒有返回值,是否需要加入return語句

在c語言中,用void關鍵字說明的函式是沒有返回值的,並且也沒有必要加入return語句。在有些情況下,乙個函式可能會引起嚴重的錯誤,並且要立即退出該函式,這時就應該加入return語句,以跳過函式體內還未執行到的**。但是在void函式中隨意加入return語句是乙個不好的程式設計習慣,困此,在void函式中退出函式的操作應該盡量集中和簡潔。

8、怎樣把陣列作為引數傳給函式

在把陣列作為引數傳給函式時,有值傳遞(傳值 by value)和位址傳遞(傳址 by reference)二種方式。在值傳遞方式中,在說明和定義函式時,要在陣列引數尾部加上一對方括號,呼叫函式時只需要將陣列的位址(即陣列名)傳遞給陣列。

例:在下例中陣列x是通過值傳遞方式傳遞給byval_func()函式的。

#include

void byval_func(int);    /*這個函式的引數是乙個int型陣列*/

void main(void)

void byval_func(int i)

}在上例中,定義了乙個名為x的陣列,並對它的10個元素賦了初值,函式byval_func()的說明如下所示:

int byval_func(int);

引數int告訴編譯程式byval_func()只有乙個引數,即乙個int型別值組成的陣列,在呼叫byval_func()函式時,只需將陣列的位址傳遞給該函式,即:

byval_func(x);

在值傳遞方式中,陣列x將被複製乙份,複製所得的陣列將被存放在棧中,然後由byval_func()函式接收並列印出來。由於傳遞給byval_func()函式的是初始陣列的乙份考貝,因此在byval_func()函式內部修改傳遞過來的陣列對初始陣列沒有任何影響。

值傳遞方式的開銷是非常大的,其原因有這樣幾點:第一,需要完整地複製初始陣列並將這份考貝存放到棧中,這將耗費相當長的時間,因而值傳遞方式的效率比較低二,初始陣列的考貝需要占用額外的記憶體空間(棧中的記憶體)三,編譯程式需要專門產生一部分用來複製初始陣列的**,這將使程式變大。

位址傳遞方式克服了值傳遞方式的缺點,是一種更好的方式。在位址傳遞方式中,傳遞給函式的是指向初始陣列的指標,不用複製初始陣列,因此程式變得精練和高效,並且也節省了記憶體和棧空間。在位址傳遞方式 中,只需在函式原型中將函式的引數說明為指向陣列元素資料型別 的乙個指標。

例:#include

void const_func(const int *);

void main(void)

void const_func(const int  *i)

}在上例中,同樣定義了乙個名為x的陣列,並對它的10個元素賦了初值。函式const_func()的說明如下所示:

int const_func(const int *);

引數const int *告訴編譯程式const_func()函式只有乙個引數,即指向乙個int型別常量的指標。在呼叫const_func()函式時,同樣只需將陣列的位址傳遞給該函式,即:

const_func(x);

在位址傳遞方式中,沒有複製初始陣列並將其考貝存放在棧中,const_func()函式只接收到指向乙個int 型別常量的指標,因此在編寫程式時要保證傳遞給const_func()函式的是乙個由int型別值組成的陣列的指標。const修飾符的作用是防止const_func()函式意外地修改初始陣列中的某乙個元素。

位址傳遞方式唯一不足的是必須由程式本身來保證將乙個陣列傳遞給函式作為引數,例如在函式const_func()的原型和定義中,都沒有明確指示該函式的引數是指向乙個由int型別值組成的陣列的指標。但是,位址傳遞方式速度快,效率高,因此在對執行速度要求比效高時,應訪採用這種方式。

競賽入門 問與答

no1 有何教材參考 挑戰程式設計競賽 acm icpc全球總冠軍 巫澤俊主譯 人民郵電出版社 問2 學習方法 1 學習的方法幾乎一樣入了門之後大家都是在題庫上拼命做題。全世界沒有乙個人例外。2 自學是唯一的方法。acm不是看懂的,也不是聽懂的,而是練懂的。懂的唯一方法就是要多練多寫。在賽場上無數悔...

string函式 菜鳥教程函式

運算子 條件語句 迴圈與js基礎語法類似,就不再記錄了。無返回值函式 定義方式 1function function name 2 有返回值函式 定義方式 1function function name return type 帶引數函式 定義方式 1function func name param...

Python 函式 菜鳥教程

python3函式 菜鳥程式設計 計算面積函式 學習他的呼叫函式方式!def area width,height return width height w 4 h 5 print width w,height h,area area w,h width 4 height 5 area 20 pyt...