在此前,我們寫的程式都只有乙個主函式(main函式)
但是當乙個程式的功能非常多的時候,主函式就會十分的冗雜。
這個時候我們可以把乙個能實現乙個小的功能的一段**劃分到乙個的函式中,在需要實現這個功能時呼叫這個函式。
我們可以將不同功能的**段劃分到不同的函式中。就可以簡化函式,並且使得程式結構化。就像之前對字串的操作函式一樣。
/*函式型別 函式名(引數變數型別 引數名)//引數可以沒有,也可以是多個的
*///如:
int max(int x,int y)
int main()
執行結果:
交換結果為 a = 5, b = 10當主函式呼叫swap函式時,只是將a和b的值給了x和y,而不是讓a成為x,b成為y。所以在交換完成後,交換的是x好y的值,而a和b並沒有改變。
也就是說在呼叫時:
執行了一步賦值的操作x=a;y=b;
如果函式要使用引數,則必須宣告接受引數值的變數。這些變數稱為函式的形式引數。
形式引數就像函式內的其他區域性變數,在進入函式時被建立,退出函式時被銷毀。
void swap(int x, int y)
int main()
主函式中swap函式在呼叫時a和b被稱為實參,x和y被稱為形參。
實參可以被理解為真實的,而形參可以被理解為「虛的」,但無論是形參還是實參都佔了實際的記憶體。
乙個程式,例如
int n;
void fn1()
int m;
int fn2()
int main()
n和m在函式外部,它們就是全域性變數:
對於n而言fn1函式和fn2函式和main函式均可以使用它。
但是m只有fn2函式和main函式可以使用,fn1則不行。
變數的作用範圍是從定義位置開始的。
a,b;x,y;i,j;z則是區域性變數
只能在它們所在的函式中使用。
先看**(借用上面的例子):
#includevoid swap(int x, int y);//宣告
int main()
void swap(int x, int y)//定義
宣告只是告訴編譯器有這樣乙個函式,具體的**不寫,但要加上;
。
而定義就是要寫出函式的函式體。
當定義寫在main函式之後時則需要在main函式之前加上宣告。
當定義在main函式之前時則不用寫宣告。
上面說過了,函式自己呼叫自己就是遞迴。
這裡用遞迴來實現階乘
int fn(int n)
int main()
執行結果:
5!=120首先,這題我們要先明白遞迴的概念,遞迴指的是乙個函式自己呼叫自己,首先我們知道主函式main只能有乙個也不可能被其他函式呼叫,所以我們肯定要寫乙個子函式,然後再子函式裡用遞迴。然後我們去找遞迴的結束標誌,如果沒有結束標誌,那麼這個遞迴程式會一直呼叫自己,導致你的程式崩潰,所以去找遞迴的結束標誌很重要。很明顯,當n的值等於1的時候,我們就不用再呼叫自己了,然後返回到上一層,乘上這一層的n,然後再一層一層返回,每返回一層,n的值就比返回的n大1,直到返回到第一層的時候,就是我們的第乙個乘數。這樣我們就模擬出了階乘的演算法,然後再返回給主函式列印。
C語言 函式
1 實參和形參在數量上,型別上,順序上應嚴格一致,否則會發生 型別不匹配 錯誤。2 實參可以是常量,變數,表示式甚至是函式。但是在傳遞給函式前,必須有確定的值。3 形參變數只有在被呼叫時才分配記憶體單元,只有在函式內部有效,函式結束後不能再使用。4 實參和形參佔據不同的儲存單元。5 函式預設採用值傳...
c語言 函式
函式是實現某個功能的 段 函式之間的關係是並列的,不能巢狀 函式的定義 函式的返回值型別 函式名 引數的型別 引數名1.正常的函式有三部分 1.函式的宣告 2.函式的定義 3.函式的呼叫 如果函式在定義之前被呼叫的話,需要對函式提前進行宣告,當然在定義之後在呼叫如果沒有宣告也不會提示錯誤 函式的返回...
C語言函式
和變數 控制流 條件一樣 函式也是現代程式語言的基本組成部分。他可以使我們在應用中重複利用一塊 對於 的組織和維護是很有必要的。您將在ios和os x的框架中發現大量的例子。像其他的基礎元素一樣,object c的函式也是建立在c語言函式之上的。這章我們將介紹c語言最重要的方面,包括基本語法 宣告和...