函數(shù)
大多數(shù)編程語言都支持定義某種形式的函數(shù)。使用函數(shù)可以將一個大程序分解為小的代碼塊并分別命名,然后這些命名的代碼塊就可以在整個程序中重復(fù)使用了。函數(shù)輸入?yún)?shù)并返回一個結(jié)果。C函數(shù)可以輸入的參數(shù)個數(shù)沒有限制。一般來說,對于編譯器而言,只要在調(diào)用函數(shù)以前事先聲明函數(shù)名稱,則各函數(shù)在程序中的順序并不重要。
我們已經(jīng)討論過一些有關(guān)函數(shù)的內(nèi)容了。前面遇到的rand函數(shù)幾乎是最簡單的函數(shù)了。它不接受參數(shù)并返回一個整數(shù):
int rand()/* 摘自 K&R - 生成一個0-32767之間的隨機(jī)數(shù)字。*/{rand_seed = rand_seed * 1103515245 +12345;return (unsigned int)(rand_seed / 65536) % 32768;}
int rand()這些程序定義了rand函數(shù),還指明rand沒有輸入?yún)?shù)并返回一個整數(shù)。此函數(shù)沒有局部變量,但如果需要的話,局部變量會緊接著打開的{開始。(C 允許您在任何 { 后面聲明變量,這些變量一直存在,直到程序執(zhí)行至那個匹配的 } 為止,此后即不復(fù)存在。因此函數(shù)的局部變量在遇到函數(shù)中匹配的 } 時就消失了。在其生存周期內(nèi),局部變量被保存在系統(tǒng)棧上。)請注意第一行的()后面沒有;。您若不小心加上了分號,編譯器會給出一大堆莫名其妙的錯誤信息。另外還要注意即使當(dāng)函數(shù)沒有參數(shù)時也要使用()。括號告訴編譯器您在聲明一個函數(shù)而不是簡單地聲明一個int類型。
對于任何要返回結(jié)果的函數(shù)來說,return語句是不可或缺的。它指明函數(shù)要返回的值并使函數(shù)立即退出。因此您可以在函數(shù)中放置多個return語句作為函數(shù)的多個退出點(diǎn)。若函數(shù)中沒有return語句,則函數(shù)在執(zhí)行到 } 時退出并返回一個隨機(jī)值(這時很多編譯器會發(fā)出警告)。C中的函數(shù)可以返回任何類型的值:包括int、float、char、結(jié)構(gòu)體等等。
調(diào)用rand函數(shù)的方式有許多種。例如:x=rand();。此語句中x被賦值為rand的返回值。注意,在函數(shù)調(diào)用中即使沒有參數(shù)也必須使用(),否則x將被賦值為rand函數(shù)的內(nèi)存地址,而這通常并非您的本意。
也可以用這種方式調(diào)用rand:
if (rand() > 100)
或:
rand();
后一種方式中,rand函數(shù)被調(diào)用了,可是其返回值隨即被丟棄。您可能不會以這種方式使用rand,但很多函數(shù)會返回某種錯誤代碼作為調(diào)用結(jié)果,而您又不關(guān)心這些錯誤代碼的話(如您知道不可能發(fā)生錯誤),就可以用這種調(diào)用方式將其丟棄。
如果您不想返回任何值的話,函數(shù)可以使用void作為返回類型。例如:
void print_header(){printf("第一個程序\n");printf("作者 Marshall Brain\n");printf("版本 1.0, 發(fā)布于1991年12月26日\n");}
此函數(shù)沒有返回值??梢韵裣旅孢@樣調(diào)用:
print_header();
調(diào)用時必須加上(),否則函數(shù)不會被調(diào)用,即使此語句在很多系統(tǒng)上能通過編譯。
C函數(shù)可以接受任何類型的參數(shù)。例如:
fact(int i){int j,k;j=1;for (k=2; k<=i; k++)j=j*k;return j;}
返回傳入的整型參數(shù)i的階乘。用逗號分隔多個參數(shù):
int add (int i, int j){return i+j;}
C語言經(jīng)歷了許多年的演變。有時您會看到用“舊式風(fēng)格”編寫的函數(shù)。以add為例:
int add(i,j)
int i;int j;{return i+j;}
您應(yīng)該能夠讀懂舊式代碼。它們在執(zhí)行上并無不同,只不過是另一種書寫格式罷了。編寫程序時應(yīng)該使用“新式風(fēng)格”(稱為ANSI C),把類型聲明寫在參數(shù)列表中;除非您要把代碼交付給只有“舊式”(非ANSI C)編譯器的人。