亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言編程中函數的基本學習教程

2020-05-23 14:12:23
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C語言編程中函數的基本學習教程,其中著重講到了傳值調用與參數,需要的朋友可以參考下
 

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

到目前為止,我們所使用的函數(如 printf、getchar 和 putchar 等)都是函數庫中提供的函數?,F在,讓我們自己動手來編寫一些函數。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;}

程序運行結果:

C語言編程中函數的基本學習教程

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 的原始參數值。

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

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频中文字幕| 亚洲美女www午夜| 精品亚洲一区二区三区四区五区| 久久视频免费观看| 中文国产亚洲喷潮| 久精品免费视频| 在线观看欧美视频| 久久99久久亚洲国产| 粗暴蹂躏中文一区二区三区| 伊人久久久久久久久久久久久| 日韩欧美中文字幕在线播放| 亚洲欧洲成视频免费观看| 国产精品一二三在线| 国产精品爽爽爽| 久久av中文字幕| 日韩中文综合网| 日韩一区二区三区在线播放| 亚洲自拍另类欧美丝袜| 国产欧美久久久久久| 欧美一区二区.| 国产精品高潮粉嫩av| 国产丝袜视频一区| 麻豆国产精品va在线观看不卡| 亚洲精品xxxx| 亚洲人成亚洲人成在线观看| 成人在线小视频| 成人动漫网站在线观看| 国产精品99导航| 欧美激情喷水视频| 欧美激情视频在线免费观看 欧美视频免费一| 成人免费观看49www在线观看| 日韩最新中文字幕电影免费看| 亚洲欧美日韩直播| 福利一区福利二区微拍刺激| 亚洲国产91色在线| 91精品啪在线观看麻豆免费| 亚洲a一级视频| 91在线精品播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 91国在线精品国内播放| 8x拔播拔播x8国产精品| 欧美中文在线观看| 亚洲va欧美va国产综合剧情| 亚洲国产精品人久久电影| 欧美激情中文字幕在线| 国产日韩欧美另类| 久久男人av资源网站| 日韩国产精品亚洲а∨天堂免| 国产精品自拍网| 国产精品美女在线| 久久综合国产精品台湾中文娱乐网| 亚洲国产第一页| 乱亲女秽乱长久久久| 日韩亚洲欧美中文在线| 欧美午夜激情小视频| 亚洲欧美另类人妖| 国产精品第二页| 秋霞午夜一区二区| 亚洲精品suv精品一区二区| 欧美激情精品久久久久久蜜臀| 国产亚洲精品久久久| 精品亚洲一区二区| 欧美性高潮床叫视频| 91老司机在线| 日韩av中文在线| 久久久久久午夜| 97视频免费在线观看| 亚洲毛片在线免费观看| 欧美日韩免费观看中文| 国产亚洲精品久久久久动| 日韩亚洲第一页| 欧洲中文字幕国产精品| 欧美第一淫aaasss性| 国产亚洲精品美女久久久| 久久国产精品久久久久| 国产成人精品视频在线| 国产精品一区电影| 日韩精品中文字幕视频在线| 欧美成人h版在线观看| 欧美激情亚洲综合一区| 最近2019中文字幕第三页视频| 91高清免费视频| 欧美一级视频免费在线观看| 国产精品香蕉在线观看| 北条麻妃一区二区三区中文字幕| 亚洲免费影视第一页| 91九色视频导航| 成人免费午夜电影| 国产精品成人国产乱一区| 亚洲精品电影在线| 成人h视频在线观看播放| 18一19gay欧美视频网站| 亚洲亚裔videos黑人hd| 欧美成人精品一区二区三区| 欧美国产日韩一区二区| 午夜伦理精品一区| 亚洲人成欧美中文字幕| 欧美精品在线免费观看| 欧美精品在线观看| 久久国产精品久久久久久久久久| 中文字幕一区电影| 日韩欧美中文字幕在线播放| 国产欧美日韩高清| 亚洲欧美国产一区二区三区| 成人乱色短篇合集| 欧美三级欧美成人高清www| 亚洲欧美精品suv| 中文字幕精品国产| 亚洲欧美999| 欧美激情三级免费| 亚洲国产精品女人久久久| 欧美超级乱淫片喷水| 国产一区二区丝袜| 国产精品高潮在线| 欧美性猛交视频| 色偷偷888欧美精品久久久| 亚洲国产福利在线| 欧美国产精品人人做人人爱| 国产一区二区三区在线观看网站| 日韩在线不卡视频| 亚洲激情在线观看视频免费| 久久久精品国产网站| 欧美劲爆第一页| 正在播放国产一区| 欧美怡红院视频一区二区三区| 欧洲成人在线观看| 精品久久久久久久久久| 7777精品久久久久久| 欧美成人一区在线| 亚洲成人av资源网| 国产性色av一区二区| 亚洲欧美国产另类| 欧美华人在线视频| 日韩电影免费观看在线观看| 最近2019年好看中文字幕视频| 午夜欧美不卡精品aaaaa| 国内精品视频久久| 欧美性videos高清精品| 久久久999精品视频| 精品成人av一区| 国产91九色视频| 欧美激情中文字幕乱码免费| 国产精品久久av| 欧美乱大交做爰xxxⅹ性3| 在线播放精品一区二区三区| 91精品国产自产91精品| 欧美极品欧美精品欧美视频| 精品日本高清在线播放| 欧美视频在线观看免费网址| 欧美精品一区在线播放| 亚洲人成网站999久久久综合| 精品国产一区二区三区久久| 久热在线中文字幕色999舞| 欧美成人性色生活仑片| 国产视频亚洲视频| 欧美大荫蒂xxx| 国产精品第一页在线| 欧美激情喷水视频| 国产精品久久电影观看| 欧美激情videos| 欧美亚州一区二区三区| 91精品久久久久久久久不口人| 欧美一级片在线播放| 色无极亚洲影院|