c語言函數(shù)語法詳解


本文是小結(jié)了一下C語言的函數(shù)語法吵取,詳細(xì)介紹了C語言函數(shù)語法的概述、函數(shù)的定義锯厢、函數(shù)的返回值皮官、函數(shù)調(diào)用等7個方面的內(nèi)容,非常詳細(xì)实辑,這里推薦給小伙伴們捺氢。

1、概述

在C語言中剪撬,函數(shù)是來完成子程序或者某個模塊的功能摄乒。有主程序或者其他函數(shù)調(diào)用,其他函數(shù)之間可以相互調(diào)用残黑。同一函數(shù)可以被一個或多個函數(shù)任意次調(diào)用缺狠。

注意:

a、一個C程序有一個或多個程序模塊組成萍摊,每一個程序模塊作為一個源程序文件挤茄。一個源文件可以為多個C程序共用。

b冰木、程序在編譯時是以源文件為單位進(jìn)行編譯穷劈,而不是以函數(shù)為單位進(jìn)行編譯。一個源文件就是一個編譯單元

c踊沸、C程序的執(zhí)行是從main函數(shù)開始歇终,也是在main函數(shù)中結(jié)束整個程序

d、所有函數(shù)是平行的逼龟,即在定義函數(shù)時是分別進(jìn)行的评凝,是互相獨立的。一個函數(shù)并不從屬于另一個函數(shù)腺律,即函數(shù)不能嵌套定義奕短。函數(shù)之間可以相互調(diào)用,但不能調(diào)用main函數(shù)匀钧。main函數(shù)是系統(tǒng)調(diào)用的翎碑。

e、從用戶使用角度看之斯,函數(shù)分為兩種:

(1)標(biāo)準(zhǔn)函數(shù)日杈。標(biāo)準(zhǔn)函數(shù)即函數(shù)庫,它由系統(tǒng)提供。不同的C語言編譯系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)的數(shù)量和功能或有不同莉擒,但是基本函數(shù)是一樣的酿炸。

(2)用戶自定義函數(shù)。

f涨冀、從函數(shù)形式看梁沧,函數(shù)分為兩種:

(1)有參函數(shù)。

(2)無參函數(shù)蝇裤。在調(diào)用函數(shù)時廷支,主調(diào)函數(shù)通過參數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù)

2、函數(shù)的定義

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

類型表示符 函數(shù)名()

{

聲明部分

語句部分

}

【實】定義無參函數(shù)栓辜,輸出“Hello World”字符串

復(fù)制代碼代碼如下:

void show()

{

printf("Hello World");

}

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

類型標(biāo)識符 函數(shù)名(形式參數(shù)列表)

{

聲明部分

語句部分

}

【例】傳遞兩個int的參數(shù)a和b恋拍,然后計算a加b的和,然后返回a加b的和藕甩。

復(fù)制代碼代碼如下:

int add(int a, int b)

{

int t = 0; // 聲明部分

t = a + b;

return t;

}

空函數(shù)就是沒有函數(shù)體的函數(shù)施敢,如:

void test(){ ... }

調(diào)用空函數(shù)時,什么工作也不做狭莱,沒有任何實際作用僵娃。在程序設(shè)計中往往程序初期只實現(xiàn)基本功能,對于高級功能我們可以提供一空函數(shù)腋妙,以后實現(xiàn)該空函數(shù)默怨。

定義函數(shù)時指定的參數(shù)稱為“形參”,調(diào)用函數(shù)時傳遞的參數(shù)稱為“實參”骤素。

a匙睹、在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時济竹,它們并不占內(nèi)存中的存儲單元痕檬。只有在發(fā)生函數(shù)調(diào)用時,函數(shù)中的形參才被分配內(nèi)存單元送浊。在調(diào)用結(jié)束后梦谜,形參所占用的內(nèi)存單元也被釋放。

b袭景、實參可以是常量唁桩、變量或表達(dá)式,如:max(3, a+b);

c浴讯、在被定義的函數(shù)中朵夏,必須指定形參的類型

d、實參和形參的類型應(yīng)相同或賦值兼容榆纽。

e、在C語言中,實參向形參數(shù)據(jù)傳遞是“值傳遞”奈籽,單向傳遞饥侵,只由實參傳遞給形參,而形參不能傳遞給實參衣屏。在內(nèi)存中形參和實參是不同的內(nèi)存單元躏升。因此,改變形參的值不會影響實參的值狼忱。

3膨疏、函數(shù)的返回值

通常,希望通過函數(shù)調(diào)用是主調(diào)函數(shù)能得到一個確定的值钻弄,這就是函數(shù)的返回值佃却。

a、函數(shù)的返回值是通過函數(shù)中的return語句獲得的窘俺。return語句將被調(diào)用函數(shù)中的一個確定值帶回主調(diào)函數(shù)中去饲帅。如果需要從被調(diào)用函數(shù)帶回一個函數(shù)值,被調(diào)函數(shù)中必須包含return語句瘤泪。如果不需要從被調(diào)函數(shù)帶回函數(shù)值可以不需要return語句灶泵。一個函數(shù)可以有多個return語句,執(zhí)行到哪個return語句对途,哪個語句就起作用赦邻。

b、函數(shù)值的類型实檀。既然函數(shù)有返回值深纲,這個值當(dāng)然應(yīng)屬于某一個確定的類型,應(yīng)當(dāng)在定義函數(shù)時指定函數(shù)值的類型劲妙。C語言中湃鹊,凡是不加類型說明的函數(shù),自動按整型處理镣奋。在Turbo C 2.0中不寫返回類型可以通過币呵,Turbo C++ 3.0編譯時不能通過。所以建議讀者在定義時對所有函數(shù)都指定函數(shù)類型侨颈。

c余赢、在定義函數(shù)是指定的類型應(yīng)該與return返回類型一致。如果函數(shù)值的類型和return語句中表達(dá)式值類型不一致哈垢,則按照函數(shù)類型為準(zhǔn)妻柒。

d、對于不帶回值的函數(shù)耘分,應(yīng)當(dāng)用“void”定義函數(shù)為“無類型”或稱“空類型”举塔。此時函數(shù)體中不得出現(xiàn)return語句绑警。

4、函數(shù)調(diào)用

函數(shù)調(diào)用的一般形式為:函數(shù)名(實參列表)央渣;如:

復(fù)制代碼代碼如下:

int a = max(2, 4);

按函數(shù)在程序中出現(xiàn)的位置來分计盒,可以有以下3種函數(shù)調(diào)用方式:

a、函數(shù)語句芽丹。把函數(shù)調(diào)用作為一個語句北启。此時不許要函數(shù)返回值。如: show();

b拔第、函數(shù)表達(dá)式咕村。函數(shù)出現(xiàn)在一個表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式蚊俺,需要函數(shù)返回一個確定的值懈涛。如:a = 2*max(a, b);

c、函數(shù)參數(shù)春叫。函數(shù)調(diào)用作為一個函數(shù)的參數(shù)肩钠。如:m = max(a, max(b, c));

5、對被調(diào)函數(shù)的聲明和函數(shù)原型

在一個函數(shù)中調(diào)用另一個函數(shù)需要具備以下條件:

a暂殖、被調(diào)函數(shù)必須是已經(jīng)存在的函數(shù)

b价匠、如果使用函數(shù)庫,還應(yīng)該在文本文件開頭用#include命令將調(diào)用有關(guān)庫函數(shù)時所需用到的信息“包含”到本文件中來呛每。如:#include

其中“stdio.h”是一個“頭文件”踩窖。在stdio.h文件中包含了輸入輸出庫函數(shù)所用到的一些宏定義信息。如果不包含stdio.h文件的信息晨横,就無法使用輸入輸出庫中的函數(shù)洋腮。

c、如果使用用戶自己定義的函數(shù)手形,而該函數(shù)的位置在調(diào)用它的函數(shù)的后面(在同一個文件中)啥供,應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)進(jìn)行聲明。如:

復(fù)制代碼代碼如下:

#include

void main()

{

float add(float x, float y); // 或者: float add(float, float);

float a, b, c;

scanf("%f%f", &a, &b);

c = add(a, b);

printf("sum is %f\n", c);

}

float add(float x, float y)

{

return x + y;

}

6库糠、局部變量和全局變量

a伙狐、局部變量

在一個函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只能在函數(shù)范圍內(nèi)才有效瞬欧,也就是說只在本函數(shù)內(nèi)才能使用它們贷屎,在此函數(shù)外部不能使用這些變量。如:

復(fù)制代碼代碼如下:

float f1(int a)

{

int b, c;???? // b艘虎、c變量只在f1函數(shù)內(nèi)部有效

}

char f2(int x, int y)

{

int i, j;???? // i唉侄、j變量在f2函數(shù)內(nèi)部有效

}

void main()

{

int m, n;? // m、n變量在main函數(shù)中有效

}

注意:

1)主函數(shù)中定義的變量(m野建、n)也只在主函數(shù)中有效属划,而不因為在主函數(shù)中定義而在整個文件或程序中有效恬叹。主函數(shù)也不能使用其他函數(shù)中定義的變量。

2)不同函數(shù)中可以使用相同名字的變量榴嗅,它們代表不同的對象妄呕,互不干擾陶舞。

3)形式參數(shù)也是局部變量嗽测。

4)在一個函數(shù)內(nèi)部可以在符合語句中定義變量,這些變量值在本符合語句中有效肿孵,這種符合語句稱為“分程序”或“程序塊”唠粥。如:

復(fù)制代碼代碼如下:

void main()

{

int a, b; // a和b在main函數(shù)內(nèi)部有效

……

{

int c;

c = a + b; // c在該符合語句中有效

}

}

b、全局變量

在函數(shù)外部定義的變量就是全局變量停做。全局變量可以為本文件中其他函數(shù)所共用晤愧。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。如:

復(fù)制代碼代碼如下:

int a, b;??????? // a蛉腌、b的范圍從此處到源文件結(jié)尾

float f1()

{

int b, c;

}

char c1, c2;??? //? c1官份、c2的范圍是從此處到原文結(jié)尾

char f2()

{

int i, j;

}

void main()

{

int m, n;

}

注意:

(1)全局變量是函數(shù)之間交換數(shù)據(jù)的一個渠道。一般第一個字母大寫

(2)建議不再必要時不要使用全局變量烙丛。原因如下:全局變量在程序的全部過程中都占用存儲單元舅巷、使函數(shù)的通用性降低,因為依賴外部變量河咽、使用過多全局變量會降低程序的清晰性

(3)如果全局變量和局部變量同名钠右,則局部變量優(yōu)先

7、變量的存儲類別

從變量存在的生命周期來看忘蟹,變量可以分為:靜態(tài)存儲方式和動態(tài)存儲方式飒房。所謂靜態(tài)存儲方式是指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式。而動態(tài)存儲方式是在程序運行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式媚值。

內(nèi)存中的供用戶使用的存儲空間的情況狠毯。存儲空間分為三部分:

(1)程序區(qū)

(2)靜態(tài)存儲區(qū)。(存放:全局變量)內(nèi)存空間在程序開始時給全局變量賦值褥芒、分配空間嚼松,一直保存到程序運行結(jié)束才釋放,

(3)動態(tài)存儲區(qū)喂很。(存放:函數(shù)形參惜颇、自動變量、函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等)調(diào)用時才分配空間少辣,調(diào)用結(jié)束就釋放空間凌摄。

在C語言中,每個變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別漓帅。

存儲類別分為量大方式:

1)锨亏、靜態(tài)存儲類別

2)痴怨、動態(tài)存儲類別

具體包含4種:自動的(auto)、靜態(tài)的(static)器予、寄存器(register)浪藻、外部的(extern)

a、auto

b乾翔、static

c爱葵、register

d、extern

8反浓、內(nèi)部函數(shù)和外部函數(shù)

a萌丈、內(nèi)部函數(shù)

如果一個函數(shù)只能被本文件中其他函數(shù)調(diào)用,則稱為“內(nèi)部函數(shù)”雷则。在定義內(nèi)部函數(shù)時辆雾,在函數(shù)名和函數(shù)類型前面加上static。語法如下:

static 類型標(biāo)識符 函數(shù)名(形參列表)月劈;

例如:

復(fù)制代碼代碼如下:

static int add(int a, int b);

內(nèi)部函數(shù)又稱靜態(tài)函數(shù)度迂,因為它是用static聲明的。使用內(nèi)部函數(shù)猜揪,可以使函數(shù)的作用域只局限于所在文件惭墓,在不同的文件中有同名的內(nèi)部函數(shù),互不干擾湿右。

如:Test.c文件調(diào)用Test2.c文件中的void show()方法诅妹,輸出“Hello World”。

源文件:Test.c

復(fù)制代碼代碼如下:

#include

void main()

{

extern void show();

show();

}

源文件:Test2.c

復(fù)制代碼代碼如下:

#include

void show ()

{

printf("Hello World\n");

}

b毅人、外部函數(shù)吭狡。

在定義函數(shù)時,如果在函數(shù)首部的最左端加關(guān)鍵字extern丈莺,則表示此函數(shù)是外部函數(shù)划煮,可以供其他文件調(diào)用。如:

復(fù)制代碼代碼如下:

extern int max(int a, int b);? // 可以為其他文件調(diào)用

C語言規(guī)定缔俄,如果在定義函數(shù)時省略extern弛秋,則隱含為外部函數(shù)。

在需要調(diào)用此函數(shù)的文件中俐载,用extern對函數(shù)作聲明蟹略,表示該函數(shù)是在其他文件中定義的外部函數(shù)。

如:Test.c文件調(diào)用Test3.c文件中int add(int a, int b)方法遏佣,然后返回值挖炬,再將返回值傳遞給Test2.c文件中的show(int result)方法顯示出來。

源文件:Test.c

復(fù)制代碼代碼如下:

#include

void main()

{

extern void show(int result);

extern int add(int a, int b);

int result = 0;

result = add(2, 3);

show(result);

}

源文件:Test2.c

復(fù)制代碼代碼如下:

#include

void show (result)

{

printf("result=%d\n", result);

}

源文件:Test3.c

復(fù)制代碼代碼如下:

#include

int add(int a, int b)

{

return a + b;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末状婶,一起剝皮案震驚了整個濱河市意敛,隨后出現(xiàn)的幾起案子馅巷,更是在濱河造成了極大的恐慌,老刑警劉巖草姻,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钓猬,死亡現(xiàn)場離奇詭異,居然都是意外死亡撩独,警方通過查閱死者的電腦和手機敞曹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跌榔,“玉大人异雁,你說我怎么就攤上這事捶障∩耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵项炼,是天一觀的道長担平。 經(jīng)常有香客問我,道長锭部,這世上最難降的妖魔是什么暂论? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮拌禾,結(jié)果婚禮上取胎,老公的妹妹穿的比我還像新娘。我一直安慰自己湃窍,他們只是感情好闻蛀,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著您市,像睡著了一般觉痛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵休,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天薪棒,我揣著相機與錄音,去河邊找鬼榕莺。 笑死俐芯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钉鸯。 我是一名探鬼主播吧史,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亏拉!你這毒婦竟也來了扣蜻?” 一聲冷哼從身側(cè)響起逆巍,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎莽使,沒想到半個月后锐极,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡芳肌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年灵再,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿笤。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡翎迁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出净薛,到底是詐尸還是另有隱情汪榔,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布肃拜,位于F島的核電站痴腌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏燃领。R本人自食惡果不足惜士聪,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猛蔽。 院中可真熱鬧剥悟,春花似錦、人聲如沸曼库。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凉泄。三九已至躏尉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間后众,已是汗流浹背胀糜。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒂誉,地道東北人教藻。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像右锨,于是被迫代替她去往敵國和親括堤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容