欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2015年12月01日 14:29:58   投稿:goldensun  
這篇文章主要介紹了C語言編程中函數(shù)的基本學(xué)習教程,其中著重講到了傳值調(diào)用與參數(shù),需要的朋友可以參考下

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

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

下面是函數(shù) power(m, n)的定義及調(diào)用它的主程序,這樣我們可以看到一個完整的程序結(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 個或多個參數(shù)聲明)
{
 聲明部分
 語句序列
}

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

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

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

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

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

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

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

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

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

但是,合適的參數(shù)名能夠起到很好的說明性作用,因此我們在函數(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ù)名在圓括號內(nèi)指定,參數(shù)類型在左花括號之前聲明。如果沒有聲明某個參數(shù)的類型,則默認為 int 類型。函數(shù)體與 ANSI C 中形式相同。

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

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

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

下面給出MFC上的實現(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("乘方運算結(jié)果為:");

 MessageBox(str + showStr,_T("程序運行結(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;
}

程序運行結(jié)果:

2015121142749206.jpg (537×305)

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

 int my_base = _ttoi(str1);

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

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

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

傳值調(diào)用的利大于弊。在被調(diào)用函數(shù)中,參數(shù)可以看作是便于初始化的局部變量,因此額外使用的變量更少。這樣程序可以更緊湊簡潔。側(cè)如,下面的這個 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 用作臨時變量,并通過隨后執(zhí)行的 for 循環(huán)語句遞減,直到其值為 0,這樣就不需要額外引入變量 i;power 函數(shù)內(nèi)部對 n 的任何操作不會影響到調(diào)用函數(shù)中 n 的原始參數(shù)值。

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

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

相關(guān)文章

  • c++中虛函數(shù)和純虛函數(shù)的作用與區(qū)別

    c++中虛函數(shù)和純虛函數(shù)的作用與區(qū)別

    這篇文章主要介紹了c++中虛函數(shù)和純虛函數(shù)的作用與區(qū)別,需要的朋友可以參考下
    2014-07-07
  • C語言多文件編程問題解析

    C語言多文件編程問題解析

    在某些場景中,考慮到編譯效率和可移植性,#pragma once 和 #ifndef 經(jīng)常被結(jié)合使用來避免頭文件被 重復(fù)引入,這里介紹用 _Pragma 操作符避免頭文件重復(fù)引入的問題,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn)

    C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn)

    本文主要介紹了C++多態(tài)虛析構(gòu)和純虛析構(gòu)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-09-09
  • C語言中求解圖形的問題

    C語言中求解圖形的問題

    這篇文章主要介紹了C語言中求解圖形的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解C++ string常用截取字符串方法

    詳解C++ string常用截取字符串方法

    這篇文章主要介紹了C++ string常用截取字符串方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-05-05
  • C語言與C++項目實現(xiàn)相互調(diào)用

    C語言與C++項目實現(xiàn)相互調(diào)用

    extern?“c”的作用可以實現(xiàn)c語言和c++相互調(diào)用,本文就詳細的介紹一下C語言與C++項目實現(xiàn)相互調(diào)用,感興趣的可以了解一下
    2022-01-01
  • c++ vector模擬實現(xiàn)的全過程

    c++ vector模擬實現(xiàn)的全過程

    這篇文章主要給大家介紹了關(guān)于c++ vector的模擬實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-04-04
  • C語言異常處理機制案例講解

    C語言異常處理機制案例講解

    這篇文章主要介紹了C語言異常處理機制案例講解,本文講解了異常處理機制所用的函數(shù)和具體的代碼實現(xiàn)等,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++begin和end運算符的返回迭代器的類型如何判斷?

    C++begin和end運算符的返回迭代器的類型如何判斷?

    今天小編就為大家分享一篇關(guān)于C++begin和end運算符的返回迭代器的類型如何判斷?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • OpenCV實現(xiàn)圖像距離變換

    OpenCV實現(xiàn)圖像距離變換

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像距離變換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論