函數(shù) 大多數(shù)編程語言都支持定義某種形式的函數(shù)。使用函數(shù)可以將一個大程序分解為小的代碼塊并分別命名,然后這些命名的代碼塊就可以在整個程序中重復使用了。函數(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之間的隨機數(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í)行至那個匹配的 } 為止,此后即不復存在。因此函數(shù)的局部變量在遇到函數(shù)中匹配的 } 時就消失了。在其生存周期內(nèi),局部變量被保存在系統(tǒng)棧上。)請注意第一行的()后面沒有;。您若不小心加上了分號,編譯器會給出一大堆莫名其妙的錯誤信息。另外還要注意即使當函數(shù)沒有參數(shù)時也要使用()。括號告訴編譯器您在聲明一個函數(shù)而不是簡單地聲明一個int類型。 對于任何要返回結(jié)果的函數(shù)來說,return語句是不可或缺的。它指明函數(shù)要返回的值并使函數(shù)立即退出。因此您可以在函數(shù)中放置多個return語句作為函數(shù)的多個退出點。若函數(shù)中沒有return語句,則函數(shù)在執(zhí)行到 } 時退出并返回一個隨機值(這時很多編譯器會發(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)歷了許多年的演變。有時您會看到用“舊式風格”編寫的函數(shù)。以add為例:
int add(i,j) 您應該能夠讀懂舊式代碼。它們在執(zhí)行上并無不同,只不過是另一種書寫格式罷了。編寫程序時應該使用“新式風格”(稱為ANSI C),把類型聲明寫在參數(shù)列表中;除非您要把代碼交付給只有“舊式”(非ANSI C)編譯器的人。 |
|