a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C > 正文

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

2020-01-26 14:48:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

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

#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;}

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

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

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

main 函數(shù)在下列語(yǔ)句中調(diào)用了兩次 power 函數(shù):printf("%d %d %d/n", 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ù)的第一行語(yǔ)句 int power(int base, int n) 聲明參數(shù)的類型、名字以及該函數(shù)返回結(jié)果的類型。power 函數(shù)的參數(shù)使用的名字只在 power 函數(shù)內(nèi)部有效,對(duì)其它任何函數(shù)都是不可見(jiàn)的:其它函數(shù)可以使用與之相同的參數(shù)名字而不會(huì)引起沖突。變量 i 與 p 也是這樣:power 函數(shù)中的 i 與 main 函數(shù)中的 i 無(wú)關(guān)。

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

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

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

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

出現(xiàn)在 main 函數(shù)之前的聲明語(yǔ)句 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ù)名能夠起到很好的說(shuō)明性作用,因此我們?cè)诤瘮?shù)原型中總是指明參數(shù)名。

回顧一下,ANSI C 同較早版本 C 語(yǔ)言之間的最大區(qū)別在于函數(shù)的聲明與定義方式的不同。按照 C 語(yǔ)言的最初定義,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)之前聲明。如果沒(méi)有聲明某個(gè)參數(shù)的類型,則默認(rèn)為 int 類型。函數(shù)體與 ANSI C 中形式相同。

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

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

在 ANSI C 中定義的函數(shù)原型語(yǔ)法中,編譯器可以很容易檢測(cè)出函數(shù)調(diào)用中參數(shù)數(shù)目和類型方面的錯(cuò)誤。ANSI C 仍然支持舊式的函數(shù)聲明與定義,這樣至少可以有一個(gè)過(guò)渡階段。但我們還是強(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é)果:

2015121142749206.jpg (537×305)

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

 int my_base = _ttoi(str1);

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

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

最主要的區(qū)別在于,在 C 語(yǔ)言中,被調(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í)變量,并通過(guò)隨后執(zhí)行的 for 循環(huán)語(yǔ)句遞減,直到其值為 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ù)聲明為指針類型,并通過(guò)它間接訪問(wèn)變量。

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 全免一级毛片 | 日韩四区 | 99综合在线 | 日韩在线观看 | 亚洲视频一区二区在线 | 久久国内精品 | 成人在线免费 | 成人在线视频观看 | 欧美成人午夜精品久久久 | 免费一级片| 日韩中文字幕a | 亚洲电影一级片 | www久久精品| 色呦呦| 亚洲国产精品综合久久久 | 999在线观看精品免费不卡网站 | 精品视频久久久 | 欧美一二三区在线观看 | 热久久这里只有精品 | 久久久久久久久国产精品 | 一区二区日韩视频 | 一级黄色av片 | 欧美日韩精品免费 | 欧洲成人午夜免费大片 | 国产男人的天堂 | 91国自产区一二三区 | 精品一区不卡 | 国产精品一区免费观看 | 国产探花在线精品一区二区 | 久久99国产伦子精品免费 | 97超碰在线播放 | 国产精品久久91 | 日日干夜夜操 | 天天操网 | 日本一区二区三区中文字幕 | 亚洲精品视频在线 | 成人一区二区三区在线观看 | 一级黄色a视频 | 成人精品视频99在线观看免费 | 日韩在线一区二区 | 久久综合狠狠综合久久综合88 |