C C 學習筆記 函式

2021-10-12 06:33:15 字數 4488 閱讀 3280

形參變數只有在函式被呼叫時才會分配記憶體,呼叫結束後,立刻釋放記憶體,所以形參變數只有在函式內部有效,不能在函式外部使用。

實參可以是常量、變數、表示式、函式等,無論實參是何種型別的資料,在進行函式呼叫時,它們都必須有確定的值,以便把這些值傳送給形參,所以應該提前用賦值、輸入等辦法使實參獲得確定值。

實參和形參在數量上、型別上、順序上必須嚴格一致,否則會發生「型別不匹配」的錯誤。當然,如果能夠進行自動型別轉換,或者進行了強制型別轉換,那麼實參型別也可以不同於形參型別。

函式呼叫中發生的資料傳遞是單向的,只能把實參的值傳遞給形參,而不能把形參的值反向地傳遞給實參;換句話說,一旦完成資料的傳遞,實參和形參就再也沒有瓜葛了,所以,在函式呼叫過程中,形參的值發生改變並不會影響實參。

形參和實參可以同名。但是按值傳遞時 (call by value),函式內部的形參無法改變函式外部實參的值。

要想在函式內部修改傳入的實參的值,只能使用按指標傳遞或 按引用傳遞 (call by reference)的方式

#include

#include

//要使用輸入輸出流,必須包含下面兩句

#include

using

namespace std;

//按值傳遞

intfindmax_value

(int x,

int y)

//指標傳遞

intfindmax_pointer

(int

*x,int

*y)//引用傳遞

intfindmax_reference

(int

&x,int

&y)int

main()

兩次輸入:10 20

執行結果為

10 20

max=20, a=10, b=20

max=20, a=0, b=0

10 20

max=20, a=0, b=0

函式一旦遇到 return 語句就立即返回,後面的所有語句都不會被執行到了。從這個角度看,return 語句還有強制結束函式執行的作用。

return 語句是提前結束函式的唯一辦法。return 後面可以跟乙份資料,表示將這份資料返回到函式外面;return 後面也可以不跟任何資料,表示什麼也不返回,僅僅用來結束函式。

c語言**由上到下依次執行,原則上函式定義要出現在函式呼叫之前,否則就會報錯。但在實際開發中,經常會在函式定義之前使用它們,這個時候就需要提前宣告。

所謂宣告(declaration),就是告訴編譯器我要使用這個函式,你現在沒有找到它的定義不要緊,請不要報錯,稍後我會把定義補上。

函式宣告的格式非常簡單,相當於去掉函式定義中的函式體,並在最後加上分號;,如下所示:

datatype functionname

( datatype1 param1, datatype2 param2 ...

);

也可以不寫形參,只寫資料型別:

datatype functionname

( datatype1, datatype2 ...

);

函式宣告給出了函式名、返回值型別、引數列表(重點是引數型別)等與該函式有關的資訊,稱為函式原型(function prototype)。函式原型的作用是告訴編譯器與該函式有關的資訊,讓編譯器知道函式的存在,以及存在的形式,即使函式暫時沒有定義,編譯器也知道如何使用它。

使用者往往只關心函式的功能和函式的呼叫形式,很少關心函式的實現細節,將函式定義放在最後,就是盡量遮蔽不重要的資訊,凸顯關鍵的資訊。將函式宣告放到 main() 的前面,在定義函式時也不用關注它們的呼叫順序了,哪個函式先定義,哪個函式後定義,都無所謂了。

然而在實際開發中,往往都是幾千行、上萬行、百萬行的**,將這些**都放在乙個原始檔中簡直是災難,不但檢索麻煩,而且開啟檔案也很慢,所以必須將這些**分散到多個檔案中。對於多個檔案的程式,通常是將函式定義放到原始檔(.c檔案)中,將函式的宣告放到標頭檔案(.h檔案)中,使用函式時引入對應的標頭檔案就可以,編譯器會在鏈結階段找到函式體。

很多初學者認為 stdio.h 中包含了函式定義(也就是函式體),只要有了標頭檔案就能執行,其實不然,標頭檔案中包含的都是函式宣告,而不是函式定義,**函式定義都放在了其它的原始檔中,這些原始檔已經提前編譯好了,並以動態鏈結庫或者靜態鏈結庫的形式存在,**只有標頭檔案沒有系統庫的話,在鏈結階段就會報錯,程式根本不能執行。

除了函式,變數也有定義和宣告之分。實際開發過程中,變數定義需要放在原始檔(.c檔案)中,變數宣告需要放在標頭檔案(.h檔案)中,在鏈結程式時會將它們對應起來。

函式過載,即一物多用,同乙個函式名可以有

即可以作為多個函式(以上兩者至少有乙個是不同的,否則不知道系統呼叫哪個函式)。

例如

int

max(

int a,

int b,

int c=1)

intmax

(int a,

int b)

//以上的max便是過載函式,擁有相同型別、不同數目的引數

也可以用函式模板來完成函式過載(適用於引數型別不同,但引數個數相同的同名函式)。

函式模板通式為

template

<

typename t1, typename t2>

//允許有多個型別引數

ret-type func-

name

(parameter list)

例子

#include

#include

using

namespace std;

template

<

typename t>

inline t const

& max (t const

& a, t const

& b)

int main (

)

當上面的**被編譯和執行時,它會產生下列結果:

max(i, j): 39

max(f1, f2): 20.7

max(s1, s2): world

在函式宣告中可以設定預設引數;

例如

//函式宣告

intfindmax

(int a,

int b=0)

;//在呼叫時(要給出預設值)

intmain()

//函式定義時不給出預設值(宣告已經給過)

intfindmax

(int a,

int b)

預設引數必須在引數列表的末尾。

注意:函式不能既作為過載函式,又作為有預設引數的函式。會出現歧義。

#include

#include

using

namespace std;

intmax

(int a,

int b,

int c=1)

intmax

(int a,

int b)

//以上的max便是過載函式

intmain()

引入內聯函式的目的是為了解決程式中函式呼叫的效率問題,這麼說吧,程式在編譯器編譯的時候,編譯器將程式**現的內聯函式的呼叫表示式用內聯函式的函式體進行替換,而對於其他的函式,都是在執行時候才被替代。這其實就是個空間代價換時間的節省。所以內聯函式一般都是1-5行的小函式。在使用內聯函式時要留神:

如果想把乙個函式定義為內聯函式,則需要在函式名前面放置關鍵字inline,在呼叫函式之前需要對函式進行定義。

在類定義中的定義的函式都是內聯函式,即使沒有使用inline說明符。

#include

using

namespace std;

inline

intmax

(int x,

int y)

// 程式的主函式

intmain()

執行結果

max (20,10): 20

max (0,200): 200

max (100,1010): 1010

C C 學習筆記 02 函式

規範 定義變數名的時候盡量規範,養成習慣,下面一些是常用的變數名字 之後繼續補充 拒絕再用abcd定義 英文單詞縮寫 temporary temp 暫時 臨時的 tmp flag 標誌 標識 count 計數 increment 加1 inc decrement 減1 dec message 訊息 ...

c c 時間函式學習筆記

include include include include include using namespace std int main int argc,char ar for debug for vector iterator it time.begin it time.end it 將tm結構...

C C學習筆記

1.儲存型別 標準c語言為變數 常量 函式定義了4種儲存型別 extern,auto,static,register,它們分別用乙個關鍵字 儲存型別說明符 來說明。這4種儲存型別可分為兩種生存期限 永久的 即整個程式執行期間都存在 extern和static 和臨時的 即暫時儲存在堆疊和暫存器中 a...