C說話編程中函數的根本進修教程。本站提示廣大學習愛好者:(C說話編程中函數的根本進修教程)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話編程中函數的根本進修教程正文
C 說話中的函數等價於 Fortran 說話中的子法式或函數,也等價於 Pascal 說話中的進程或函數。函數為盤算的封裝供給了一種輕便的辦法,爾後應用函數時不須要斟酌它是若何完成的。應用設計准確的函數,法式員無需斟酌功效是若何完成的,而只需曉得它具有哪些功效就夠了。在 C 說話中可以簡略、便利、高效地應用函數。我們常常會看到在界說後僅挪用了一次的短函數,如許做可使代碼段更清楚易讀。
到今朝為止,我們所應用的函數(如 printf、getchar 和 putchar 等)都是函數庫中供給的函數。如今,讓我們本身著手來編寫一些函數。C 說話沒有像 Fortran 說話一樣供給相似於**的求冪運算符,我們如今經由過程編寫一個求冪的函數 power(m, n)來講明函數界說的辦法。power(m, n)函數用於盤算整數 m 的 n 次冪,個中 n 是正整數。對函數挪用 power(2,5)來講,其成果值為 32。該函數並不是一個適用的求冪函數,它只能處置較小的整數的正整數次冪,但這關於解釋成績已足夠了。(尺度庫中供給了一個盤算 xy 的函數 pow(x, y)。)
上面是函數 power(m, n)的界說及挪用它的主法式,如許我們可以看到一個完全的法式構造。
#include <stdio.h> int power(int m, int n); /* test power function */ main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3,i)); return 0; } /* power: raise base to n-th power; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }
函數界說的普通情勢為:
前往值類型 函數名(0 個或多個參數聲明) { 聲明部門 語句序列 }
函數界說可以以隨意率性順序湧現在一個源文件或多個源文件中,但統一函數不克不及朋分寄存在多個文件中。假如源法式疏散在多個文件中,那末,在編譯和加載時,就須要做更多的任務,但這是操作體系的緣由,其實不是說話的屬性決議的。我們暫且假定將 main 和 power 這兩個函數放在統一文件中,如許後面所學的有關運轉 C 說話法式的常識依然有用。
main 函數鄙人列語句中挪用了兩次 power 函數:printf("%d %d %d\n", i, power(2, i), power(-i, 3)); 每次挪用時,main 函數向 power 函數傳遞兩個參數;在挪用履行完成時,power 函數向 main 函數前往一個格局化的整數並打印。在表達式中,power(2, i)同 2 和 i 一樣都是整數
power 函數的第一行語句 int power(int base, int n) 聲明參數的類型、名字和該函數前往成果的類型。power 函數的參數應用的名字只在 power 函數外部有用,對其它任何函數都是弗成見的:其它函數可使用與之雷同的參數名字而不會惹起抵觸。變量 i 與 p 也是如許:power 函數中的 i 與 main 函數中的 i 有關。
我們平日把函數界說中圓括號內列表中湧現的變量稱為情勢參數,而把函數挪用中與情勢參數對應的值稱為現實參數。
power 函數盤算所得的成果經由過程 return 語句前往給 main 函數。症結字 return 的前面可以跟任何表達式,情勢為: return 表達式;
函數紛歧建都有前往值。不帶表達式的 return 語句將把掌握權前往給挪用者,但不前往有效的值。這同等於在達到函數的右終結花括號時,函數就“達到了止境”。主調函數也能夠疏忽函數前往的值。
讀者能夠曾經留意到,main 函數的末尾有一個 return 語句。因為 main 自己也是函數,是以也能夠向其挪用者前往一個值,該挪用者現實上就是法式的履行情況。普通來講,前往值為 0 表現正常終止,前往值為非 0 表現湧現異常情形或失足停止前提。為簡練起見,後面的 main 函數都省略了 return 語句,但我們將在今後的 main 函數中包括 return 語句,以提示年夜家留意,法式還要向其履行情況前往狀況。
湧現在 main 函數之前的聲明語句 int power(int m, int n); 注解 power 函數有兩個 int 類型的參數,並前往一個 int 類型的值。這類聲明稱為函數原型,它必需與 power 函數的界說和用法分歧。假如函數的界說、用法與函數原型紛歧致,將湧現毛病。
函數原型與函數聲明中參數名不請求雷同。現實上,函數原型中的參數名是可選的,如許下面的函數原型也能夠寫成以下情勢: int power(int, int);
然則,適合的參數名可以或許起到很好的解釋性感化,是以我們在函數原型中老是指明參數名。
回想一下,ANSI C 同較早版本 C 說話之間的最年夜差別在於函數的聲明與界說方法的分歧。依照 C 說話的最後界說,power 函數應當寫成以下情勢:
/* power: raise base to n-th power; n >= 0 */ /* (old-style version) */ power(base, n) int base, n; { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }
個中,參數名在圓括號內指定,參數類型在左花括號之前聲明。假如沒有聲明某個參數的類型,則默許為 int 類型。函數體與 ANSI C 中情勢雷同。
在 C 說話的最後界說中,可以在法式的開首依照上面這類情勢聲明 power 函數:int power();
函數聲明中不許可包括參數列表,如許編譯器就沒法在此時檢討 power 函數挪用的正當性。現實上,power 函數在默許情形下將被假定前往 int 類型的值,是以全部函數的聲明可以全體省略。
在 ANSI C 中界說的函數原型語法中,編譯器可以很輕易檢測出函數挪用中參數數量和類型方面的毛病。ANSI C 依然支撐新式的函數聲明與界說,如許至多可以有一個過渡階段。但我們照樣激烈建議讀者:在應用舊式的編譯器時,最好應用舊式的函數原型聲明方法。
上面給出MFC上的完成:
void CNowaMagic_MFCDlg::OnBnClickedOk() { // TODO: 在此添加控件告訴處置法式代碼 //CDialogEx::OnOK(); //取得EDIT CEdit* base; CEdit* n; base = (CEdit*) GetDlgItem(IDC_EDIT1); n = (CEdit*) GetDlgItem(IDC_EDIT2); CString str1; CString str2; CString showStr; char tmp[10] = ""; base -> GetWindowText(str1); n -> GetWindowText(str2); //char* pstr = (LPTSTR)LPCTSTR(str1); int my_base = _ttoi(str1); int my_n = _ttoi(str2); int result = power(my_base, my_n); showStr = itoa(result,tmp,10); CString str = _T("乘方運算成果為:"); MessageBox(str + showStr,_T("法式運轉成果"),MB_OK); str.ReleaseBuffer(); } int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }
法式運轉成果:
CString轉int可使用
int my_base = _ttoi(str1);
函數聲明留意要寫到頭函數中。
傳值挪用與參數
習氣其它說話(特殊是 Fortran 說話)的法式員能夠會對 C 說話的函數參數傳遞方法覺得生疏。在 C 說話中,一切函數參數都是“經由過程值”傳遞的。也就是說,傳遞給被挪用函數的參數值寄存在暫時變量中,而不是寄存在本來的變量中。這與其它某些說話是分歧的,好比,Fortran 等說話是“經由過程援用挪用”,Pascal 則采取 var 參數的方法,在這些說話中,被挪用的函數必需拜訪原始參數,而不是拜訪參數的當地正本。
最重要的差別在於,在 C 說話中,被挪用函數不克不及直接修正主調函數中變量的值,而只能修正其公有的暫時正本的值。
傳值挪用的利年夜於弊。在被挪用函數中,參數可以看做是便於初始化的部分變量,是以額定應用的變量更少。如許法式可以更緊湊簡練。側如,上面的這個 power 函數應用了這一性質:
/* power: raise base to n-th power; n >= 0; version 2 */ int power(int base, int n) { int p; for (p = 1; n > 0; --n) p = p * base; return p; }
個中,參數 n 用作暫時變量,並經由過程隨後履行的 for 輪回語句遞加,直到其值為 0,如許就不須要額定引入變量 i;power 函數外部對 n 的任何操作不會影響到挪用函數中 n 的原始參數值。
需要時,也能夠讓函數可以或許修正主調函數中的變量。這類情形下,挪用者須要向被挪用函數供給待設置值的變量的地址(從技巧角度看,地址就是指向變量的指針),而被挪用函數則須要將對應的參數聲明為指針類型,並經由過程它直接拜訪變量。
假如是數組參數,情形就有所分歧了。當把數組名用作參數時,傳遞給函數的值是數組肇端元素的地位或地址——它其實不復制數組元素自己。在被挪用函數中,可以經由過程數組下標拜訪或修正數組元索的值。