亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言 百分網(wǎng)手機(jī)站

C語言函數(shù)的基本學(xué)習(xí)教程

時(shí)間:2020-11-19 13:01:03 C語言 我要投稿

C語言函數(shù)的基本學(xué)習(xí)教程

  C 語言中的函數(shù)等價(jià)于 Fortran 語言中的子程序或函數(shù),也等價(jià)于 Pascal 語言中的過程或函數(shù)。函數(shù)為計(jì)算的封裝提供了一種簡(jiǎn)便的方法,此后使用函數(shù)時(shí)不需要考慮它是如何實(shí)現(xiàn)的。使用設(shè)計(jì)正確的函數(shù),程序員無需考慮功能是如何實(shí)現(xiàn)的,而只需知道它具有哪些功能就夠了。在 C 語言中可以簡(jiǎn)單、方便、高效地使用函數(shù)。我們經(jīng)常會(huì)看到在定義后僅調(diào)用了一次的短函數(shù),這樣做可以使代碼段更清晰易讀。

  到目前為止,我們所使用的函數(shù)(如 printf、getchar 和 putchar 等)都是函數(shù)庫中提供的函數(shù),F(xiàn)在,讓我們自己動(dòng)手來編寫一些函數(shù)。C 語言沒有像 Fortran 語言一樣提供類似于**的求冪運(yùn)算符,我們現(xiàn)在通過編寫一個(gè)求冪的函數(shù) power(m, n)來說明函數(shù)定義的方法。power(m, n)函數(shù)用于計(jì)算整數(shù) m 的 n 次冪,其中 n 是正整數(shù)。對(duì)函數(shù)調(diào)用 power(2,5)來說,其結(jié)果值為 32。該函數(shù)并非一個(gè)實(shí)用的求冪函數(shù),它只能處理較小的整數(shù)的正整數(shù)次冪,但這對(duì)于說明問題已足夠了。(標(biāo)準(zhǔn)庫中提供了一個(gè)計(jì)算 xy 的函數(shù) pow(x, y)。)

  下面是函數(shù) power(m, n)的定義及調(diào)用它的主程序,這樣我們可以看到一個(gè)完整的程序結(jié)構(gòu)。

  #includeint power(int m, int n);/* test power function */main(){ int i; for (i = 0; i < 10; ++i) printf("%d %d %dn", 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;}

  函數(shù)定義的一般形式為:

  返回值類型 函數(shù)名(0 個(gè)或多個(gè)參數(shù)聲明){ 聲明部分 語句序列}

  函數(shù)定義可以以任意次序出現(xiàn)在一個(gè)源文件或多個(gè)源文件中,但同一函數(shù)不能分割存放在多個(gè)文件中。如果源程序分散在多個(gè)文件中,那么,在編譯和加載時(shí),就需要做更多的工作,但這是操作系統(tǒng)的原因,并不是語言的屬性決定的。我們暫且假定將 main 和 power 這兩個(gè)函數(shù)放在同一文件中,這樣前面所學(xué)的有關(guān)運(yùn)行 C 語言程序的知識(shí)仍然有效。

  main 函數(shù)在下列語句中調(diào)用了兩次 power 函數(shù):printf("%d %d %dn", i, power(2, i), power(-i, 3)); 每次調(diào)用時(shí),main 函數(shù)向 power 函數(shù)傳遞兩個(gè)參數(shù);在調(diào)用執(zhí)行完成時(shí),power 函數(shù)向 main 函數(shù)返回一個(gè)格式化的整數(shù)并打印。在表達(dá)式中,power(2, i)同 2 和 i 一樣都是整數(shù)

  power 函數(shù)的第一行語句 int power(int base, int n) 聲明參數(shù)的類型、名字以及該函數(shù)返回結(jié)果的類型。power 函數(shù)的參數(shù)使用的名字只在 power 函數(shù)內(nèi)部有效,對(duì)其它任何函數(shù)都是不可見的:其它函數(shù)可以使用與之相同的參數(shù)名字而不會(huì)引起沖突。變量 i 與 p 也是這樣:power 函數(shù)中的 i 與 main 函數(shù)中的 i 無關(guān)。

  我們通常把函數(shù)定義中圓括號(hào)內(nèi)列表中出現(xiàn)的變量稱為形式參數(shù),而把函數(shù)調(diào)用中與形式參數(shù)對(duì)應(yīng)的值稱為實(shí)際參數(shù)。

  power 函數(shù)計(jì)算所得的結(jié)果通過 return 語句返回給 main 函數(shù)。關(guān)鍵字 return 的`后面可以跟任何表達(dá)式,形式為: return 表達(dá)式;

  函數(shù)不一定都有返回值。不帶表達(dá)式的 return 語句將把控制權(quán)返回給調(diào)用者,但不返回有用的值。這等同于在到達(dá)函數(shù)的右終結(jié)花括號(hào)時(shí),函數(shù)就“到達(dá)了盡頭”。主調(diào)函數(shù)也可以忽略函數(shù)返回的值。

  讀者可能已經(jīng)注意到,main 函數(shù)的末尾有一個(gè) return 語句。由于 main 本身也是函數(shù),因此也可以向其調(diào)用者返回一個(gè)值,該調(diào)用者實(shí)際上就是程序的執(zhí)行環(huán)境。一般來說,返回值為 0 表示正常終止,返回值為非 0 表示出現(xiàn)異常情況或出錯(cuò)結(jié)束條件。為簡(jiǎn)潔起見,前面的 main 函數(shù)都省略了 return 語句,但我們將在以后的 main 函數(shù)中包含 return 語句,以提醒大家注意,程序還要向其執(zhí)行環(huán)境返回狀態(tài)。

  出現(xiàn)在 main 函數(shù)之前的聲明語句 int power(int m, int n); 表明 power 函數(shù)有兩個(gè) int 類型的參數(shù),并返回一個(gè) int 類型的值。這種聲明稱為函數(shù)原型,它必須與 power 函數(shù)的定義和用法一致。如果函數(shù)的定義、用法與函數(shù)原型不一致,將出現(xiàn)錯(cuò)誤。

  函數(shù)原型與函數(shù)聲明中參數(shù)名不要求相同。事實(shí)上,函數(shù)原型中的參數(shù)名是可選的,這樣上面的函數(shù)原型也可以寫成以下形式: int power(int, int);

  但是,合適的參數(shù)名能夠起到很好的說明性作用,因此我們?cè)诤瘮?shù)原型中總是指明參數(shù)名。

  回顧一下,ANSI C 同較早版本 C 語言之間的最大區(qū)別在于函數(shù)的聲明與定義方式的不同。按照 C 語言的最初定義,power 函數(shù)應(yīng)該寫成下列形式:

  /* 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;}

  其中,參數(shù)名在圓括號(hào)內(nèi)指定,參數(shù)類型在左花括號(hào)之前聲明。如果沒有聲明某個(gè)參數(shù)的類型,則默認(rèn)為 int 類型。函數(shù)體與 ANSI C 中形式相同。

  在 C 語言的最初定義中,可以在程序的開頭按照下面這種形式聲明 power 函數(shù):int power();

  函數(shù)聲明中不允許包含參數(shù)列表,這樣編譯器就無法在此時(shí)檢查 power 函數(shù)調(diào)用的合法性。事實(shí)上,power 函數(shù)在默認(rèn)情況下將被假定返回 int 類型的值,因此整個(gè)函數(shù)的聲明可以全部省略。

  在 ANSI C 中定義的函數(shù)原型語法中,編譯器可以很容易檢測(cè)出函數(shù)調(diào)用中參數(shù)數(shù)目和類型方面的錯(cuò)誤。ANSI C 仍然支持舊式的函數(shù)聲明與定義,這樣至少可以有一個(gè)過渡階段。但我們還是強(qiáng)烈建議讀者:在使用新式的編譯器時(shí),最好使用新式的函數(shù)原型聲明方式。

  下面給出MFC上的實(shí)現(xiàn):

  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("乘方運(yùn)算結(jié)果為:"); MessageBox(str + showStr,_T("程序運(yùn)行結(jié)果"),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;}

  程序運(yùn)行結(jié)果:

C語言函數(shù)的基本學(xué)習(xí)教程

  CString轉(zhuǎn)int可以使用

  int my_base = _ttoi(str1);

  函數(shù)聲明注意要寫到頭函數(shù)中。

  傳值調(diào)用與參數(shù)

  習(xí)慣其它語言(特別是 Fortran 語言)的程序員可能會(huì)對(duì) C 語言的函數(shù)參數(shù)傳遞方式感到陌生。在 C 語言中,所有函數(shù)參數(shù)都是“通過值”傳遞的。也就是說,傳遞給被調(diào)用函數(shù)的參數(shù)值存放在臨時(shí)變量中,而不是存放在原來的變量中。這與其它某些語言是不同的,比如,F(xiàn)ortran 等語言是“通過引用調(diào)用”,Pascal 則采用 var 參數(shù)的方式,在這些語言中,被調(diào)用的函數(shù)必須訪問原始參數(shù),而不是訪問參數(shù)的本地副本。

  最主要的區(qū)別在于,在 C 語言中,被調(diào)用函數(shù)不能直接修改主調(diào)函數(shù)中變量的值,而只能修改其私有的臨時(shí)副本的值。

  傳值調(diào)用的利大于弊。在被調(diào)用函數(shù)中,參數(shù)可以看作是便于初始化的局部變量,因此額外使用的變量更少。這樣程序可以更緊湊簡(jiǎn)潔。側(cè)如,下面的這個(gè) power 函數(shù)利用了這一性質(zhì):

  /* 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;}

  其中,參數(shù) n 用作臨時(shí)變量,并通過隨后執(zhí)行的 for 循環(huán)語句遞減,直到其值為 0,這樣就不需要額外引入變量 i;power 函數(shù)內(nèi)部對(duì) n 的任何操作不會(huì)影響到調(diào)用函數(shù)中 n 的原始參數(shù)值。

  必要時(shí),也可以讓函數(shù)能夠修改主調(diào)函數(shù)中的變量。這種情況下,調(diào)用者需要向被調(diào)用函數(shù)提供待設(shè)置值的變量的地址(從技術(shù)角度看,地址就是指向變量的指針),而被調(diào)用函數(shù)則需要將對(duì)應(yīng)的參數(shù)聲明為指針類型,并通過它間接訪問變量。

  如果是數(shù)組參數(shù),情況就有所不同了。當(dāng)把數(shù)組名用作參數(shù)時(shí),傳遞給函數(shù)的值是數(shù)組起始元素的位置或地址——它并不復(fù)制數(shù)組元素本身。在被調(diào)用函數(shù)中,可以通過數(shù)組下標(biāo)訪問或修改數(shù)組元索的值。

  

【C語言函數(shù)的基本學(xué)習(xí)教程】相關(guān)文章:

1.2017年職稱計(jì)算機(jī)WindowsXP基本操作教程

2.計(jì)算機(jī)二級(jí)《C語言》基礎(chǔ)模擬題及答案

3.計(jì)算機(jī)二級(jí)《C語言》基礎(chǔ)練習(xí)題及答案

4.2017職稱計(jì)算機(jī)考試WindowsXP基本操作教程

5.2016年計(jì)算機(jī)二級(jí)《C語言》模擬題及答案

6.2016年計(jì)算機(jī)二級(jí)《C語言》基礎(chǔ)模擬題及答案

7.2016年計(jì)算機(jī)二級(jí)《C語言》基礎(chǔ)練習(xí)題及答案

8.2017年一級(jí)建造師新版教材的基本學(xué)習(xí)方式

9.考駕照的基本流程