本文概述
函数是一组语句, 这些语句接受输入, 进行一些特定的计算并产生输出。
我们的想法是将一些通常或重复完成的任务放在一起, 并创建一个函数, 这样我们就可以调用函数, 而不是为不同的输入一次又一次地编写相同的代码。
函数的一般形式为:
return_type function_name([ arg1_type arg1_name, ... ]) { code }
例子:
下面是一个简单的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中的值传递。例如。在下面的代码中, 不使用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函数名称();
在这种情况下, 如果该函数的返回类型与INT不同, 则编译器将显示错误。
主函数:主函数是特殊函数。每个C++程序都必须包含一个名为main的函数。它充当程序的入口点。计算机将从主要函数的开头开始运行代码。
主要函数类型:
1)第一种类型是–不带参数的主要函数:
// Without Parameters
int main()
{
...
return 0;
}
2)第二类是具有参数的主要函数:
// With Parameters
int main( int argc, char * const argv[])
{
...
return 0;
}
主函数具有参数选项的原因是允许从命令行输入。
当你将main函数与参数一起使用时, 它将程序名之后的每组字符(以空格分隔)保存为名为argv的数组中的元素。
由于main函数具有int的返回类型, 因此程序员必须在代码中始终具有return语句。返回的数字用于通知调用程序该程序执行的结果是什么。返回0表示没有问题。