函數是一組語句,這些語句接受輸入,進行一些特定的計算並產生輸出。
我們的想法是將一些通常或重複執行的任務放在一起並創建一個函數,這樣我們就可以調用該函數,而不是為不同的輸入一次又一次地編寫相同的代碼。
例:
下麵是一個簡單的C /C++程序來演示函數。
C
#include <stdio.h>
// An example function that takes two parameters 'x' and 'y'
// as input and returns max of two input numbers
int max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
// main function that doesn't receive any parameter and
// returns integer.
int main(void)
{
int a = 10, b = 20;
// Calling above function to find max of 'a' and 'b'
int m = max(a, b);
printf("m is %d", m);
return 0;
}
C++
#include <iostream>
using namespace std;
int max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
int main() {
int a = 10, b = 20;
// Calling above function to find max of 'a' and 'b'
int m = max(a, b);
cout << "m is " << m;
return 0;
}
輸出:
m is 20
我們為什麽需要函數?
- 函數可以幫助我們減少代碼冗餘。如果函數是在軟件中的多個位置執行的,則不是一次又一次地編寫相同的代碼,而是創建一個函數並在任何地方調用它。這也有助於維護,因為如果將來對函數進行更改,則必須在一處進行更改。
- 函數使代碼模塊化。考慮一個具有多行代碼的大文件。如果將代碼劃分為函數,那麽閱讀和使用代碼將變得非常簡單。
- 函數提供抽象。例如,我們可以使用庫函數而不必擔心它們的內部工作。
函數聲明
函數聲明告訴編譯器函數需要使用的參數數量,參數的數據類型和函數的返回類型。在函數聲明中將參數名稱放在函數聲明中是可選的,但有必要將其放入定義中。以下是函數聲明的示例。 (以下聲明中沒有參數名稱)
// A function that takes two integers as parameters
// and returns an integer
int max(int, int);
// A function that takes a int pointer and an int variable as parameters
// and returns an pointer of type int
int *swap(int*,int);
// A function that takes a charas parameters
// and returns an reference variable
char *call(char b);
// A function that takes a char and an int as parameters
// and returns an integer
int fun(char, int);
始終建議在使用函數之前先聲明一個函數(有關詳細信息,請參見此,此和此)。
在C語言中,我們可以在同一位置進行聲明和定義,就像在上麵的示例程序中一樣。
C還允許分別聲明和定義函數,這在庫函數的情況下尤其需要。庫函數在頭文件中聲明,並在庫文件中定義。以下是示例聲明。
參數傳遞給函數
傳遞給函數的參數稱為實際參數。例如,在上麵的程序10和20是實際參數。
函數接收的參數稱為形式參數。例如,在上麵的程序中,x和y是形式參數。
有兩種最流行的傳遞參數的方法。
按值傳遞:在這種參數傳遞方法中,將實際參數的值複製到函數的形式參數中,並將兩種類型的參數存儲在不同的存儲位置中。因此,函數內部所做的任何更改都不會反映在調用者的實際參數中。
通過引用傳遞實際參數和形式參數都指向相同的位置,因此函數內部所做的任何更改實際上都會反映在調用者的實際參數中。
在C語言中,參數始終按值傳遞。參數始終按C中的值傳遞。例如。在下麵的代碼中,使用函數fun()不會修改x的值。
C
#include <stdio.h>
void fun(int x)
{
x = 30;
}
int main(void)
{
int x = 20;
fun(x);
printf("x = %d", x);
return 0;
}
C++
#include <iostream>
using namespace std;
void fun(int x) {
x = 30;
}
int main() {
int x = 20;
fun(x);
cout << "x = " << x;
return 0;
}
輸出:
x = 20
但是,在C語言中,我們可以使用指針來獲得按引用傳遞的效果。例如,考慮以下程序。函數fun()需要指向整數(或整數地址)的指針ptr。它修改地址ptr上的值。取消引用運算符*用於訪問地址中的值。在語句“ * ptr = 30”中,地址ptr的值更改為30。地址運算符&用於獲取任何數據類型的變量的地址。在函數調用語句“ fun(&x)”中,傳遞了x的地址,以便可以使用x的地址對其進行修改。
C
# include <stdio.h>
void fun(int *ptr)
{
*ptr = 30;
}
int main()
{
int x = 20;
fun(&x);
printf("x = %d", x);
return 0;
}
C++
#include <iostream>
using namespace std;
void fun(int *ptr)
{
*ptr = 30;
}
int main() {
int x = 20;
fun(&x);
cout << "x = " << x;
return 0;
}
輸出:
x = 30
以下是有關C函數的一些重要要點。
1)每個C程序都有一個稱為main()的函數,當用戶運行該程序時,操作係統會調用該函數。
2)每個函數都有一個返回類型。如果函數不返回任何值,則將void用作返回類型。而且,如果函數的返回類型為void,我們仍然可以在函數定義的主體中使用return語句,方法是不指定常數,變量等,而隻需提及“ return;”語句即可,終止函數如下圖:
void function name(int a)
{
....... //Function Body
return; //Function execution would get terminated
}
3)在C語言中,函數可以返回除數組和函數之外的任何類型。我們可以通過返回指向數組的指針或指向函數的指針來解決此限製。
4)C中的參數列表為空表示未指定參數列表,並且可以使用任何參數調用函數。在C語言中,聲明像fun()這樣的函數不是一個好主意。要聲明隻能不帶任何參數調用的函數,我們應使用“ void fun(void)”。
附帶說明一下,在C++中,空列表意味著隻能在沒有任何參數的情況下調用函數。在C++中,void fun()和void fun(void)都是相同的。
5)如果在C程序中,在聲明函數之前調用了函數,則C編譯器將通過以下方式自動采用該函數的聲明:
int函數name();
在這種情況下,如果該函數的返回類型與INT不同,則編譯器將顯示錯誤。
相關用法
注:本文由純淨天空篩選整理自 Functions in C/C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。