C語言函數(shù)語法詳解
1、概述
在C語言中,函數(shù)是來完成子程序或者某個模塊的功能。有主程序或者其他函數(shù)調(diào)用,其他函數(shù)之間可以相互調(diào)用。同一函數(shù)可以被一個或多個函數(shù)任意次調(diào)用。
注意:
a、一個C程序有一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。一個源文件可以為多個C程序共用。
b、程序在編譯時是以源文件為單位進行編譯,而不是以函數(shù)為單位進行編譯。一個源文件就是一個編譯單元
c、C程序的執(zhí)行是從main函數(shù)開始,也是在main函數(shù)中結(jié)束整個程序
d、所有函數(shù)是平行的,即在定義函數(shù)時是分別進行的,是互相獨立的。一個函數(shù)并不從屬于另一個函數(shù),即函數(shù)不能嵌套定義。函數(shù)之間可以相互調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是系統(tǒng)調(diào)用的。
e、從用戶使用角度看,函數(shù)分為兩種:
(1)標準函數(shù)。標準函數(shù)即函數(shù)庫,它由系統(tǒng)提供。不同的C語言編譯系統(tǒng)提供的標準函數(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”字符串
void show()
{
printf("Hello World");
}
定義有參函數(shù)的一般形式:
類型標識符 函數(shù)名(形式參數(shù)列表)
{
聲明部分
語句部分
}
【例】傳遞兩個int的參數(shù)a和b,然后計算a加b的和,然后返回a加b的和。
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、實參可以是常量、變量或表達式,如: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ù)有返回值,這個值當然應(yīng)屬于某一個確定的類型,應(yīng)當在定義函數(shù)時指定函數(shù)值的類型。C語言中,凡是不加類型說明的函數(shù),自動按整型處理。在Turbo C 2.0中不寫返回類型可以通過,Turbo C++ 3.0編譯時不能通過。所以建議讀者在定義時對所有函數(shù)都指定函數(shù)類型。
c、在定義函數(shù)是指定的類型應(yīng)該與return返回類型一致。如果函數(shù)值的類型和return語句中表達式值類型不一致,則按照函數(shù)類型為準。
d、對于不帶回值的函數(shù),應(yīng)當用“void”定義函數(shù)為“無類型”或稱“空類型”。此時函數(shù)體中不得出現(xiàn)return語句。
4、函數(shù)調(diào)用
函數(shù)調(diào)用的一般形式為:函數(shù)名(實參列表);如:
int a = max(2, 4);
按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下3種函數(shù)調(diào)用方式:
a、函數(shù)語句。把函數(shù)調(diào)用作為一個語句。此時不許要函數(shù)返回值。如: show();
b、函數(shù)表達式。函數(shù)出現(xiàn)在一個表達式中,這種表達式稱為函數(shù)表達式,需要函數(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”是一個“頭文件”。在stdio.h文件中包含了輸入輸出庫函數(shù)所用到的一些宏定義信息。如果不包含stdio.h文件的信息,就無法使用輸入輸出庫中的函數(shù)。
c、如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)的后面(在同一個文件中),應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)進行聲明。如:
#include <stdio.h>
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ù)外部不能使用這些變量。如:
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)部可以在符合語句中定義變量,這些變量值在本符合語句中有效,這種符合語句稱為“分程序”或“程序塊”。如:
void main()
{
int a, b; // a和b在main函數(shù)內(nèi)部有效
……
{
int c;
c = a + b; // c在該符合語句中有效
}
}
b、全局變量
在函數(shù)外部定義的變量就是全局變量。全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。如:
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ù)需要進行動態(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 類型標識符 函數(shù)名(形參列表);
例如:
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
#include <stdio.h>
void main()
{
extern void show();
show();
}
源文件:Test2.c
#include <stdio.h>
void show ()
{
printf("Hello World\n");
}
b、外部函數(shù)。
在定義函數(shù)時,如果在函數(shù)首部的最左端加關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可以供其他文件調(diào)用。如:
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
#include <stdio.h>
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
#include <stdio.h>
void show (result)
{
printf("result=%d\n", result);
}
源文件:Test3.c
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
小伙伴們是否對C語言的函數(shù)語法理解的更深刻了呢,希望大家能夠喜歡本文。
相關(guān)文章
C++實現(xiàn)地鐵自動售票系統(tǒng)程序設(shè)計
這篇文章主要為大家詳細介紹了C++實現(xiàn)地鐵自動售票系統(tǒng)程序設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03c++中string類型和int類型相互轉(zhuǎn)換的幾種常用方法
我們在編寫程序時,經(jīng)常涉及到int與string之間的類型轉(zhuǎn)換,本文主要介紹了c++中string類型和int類型相互轉(zhuǎn)換的幾種常用方法,具有一定的參考價值,感興趣的可以了解一下2023-08-08淺析string 與char* char[]之間的轉(zhuǎn)換
與char*不同的是,string不一定以NULL('\0')結(jié)束。string長度可以根據(jù)length()得到,string可以根據(jù)下標訪問。所以,不能將string直接賦值給char*2013-10-10C++中關(guān)于多態(tài)實現(xiàn)和使用方法
這篇文章主要介紹了C++中關(guān)于多態(tài)實現(xiàn)和使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07