函数,简而言之就是一个具有一定功能的代码块,给定输入,可以给出一个输出。
一般学习一门语言,都会从一句神奇的语句开始——“Hello World!”,C语言也不例外,C语言的Hello World程序如下,其中的main就是一个函数,通过花括号{}来囊括了函数体,整个函数,只实现了在屏幕上打印输出"Hello World!"字符串。其中的\n是转义的换行符。
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}
一般来说,一个函数的定义,分为如下几个部分。
其中限定修饰符修饰函数的属性,包括static、inline、static inline等。
限定修饰符 返回值类型 函数名(参数声明表)
{
声明和语句
}
返回值类型需要在函数体(即里面的声明和语句)里面给出,使用"return 返回值"给出。如果一个函数不返回值,则返回值类型定义为void,如果没有显示指定,一般编译器默认返回值类型为int。
参数声明表给函数调用者提供函数输入,参数声明表可以定长,可以变长,C语言支持变长参数的函数,这里不错赘述,比如printf就是一个变长参数的函数。参数声明表里的参数可以加限定修饰符,比如const、restrict等,用于表示函数入参的属性。
一个函数里面可以调用别的函数,比如这里main函数里面就调用了printf函数,用于打印字符串。 当然也可以在这个函数里面调用函数本身,这个调用方式叫做递归,为了防止无休止的递归,在递归调用时需要指出递归的停止条件。
如果别的函数要调用该函数,如果在相同文件且被调用函数在调用者函数的上方,则不需要声明函数。否则,需要声明这个函数。函数声明方式如下。
限定修饰符 返回值类型 函数名(参数声明表);
如果函数在不同的.c文件里实现,那么需要在限定修饰符里加上extern。
参数声明表里面可以不指出参数具体的名称,而只说明函数参数的类型。
下面给出一个例子,汇总说明一下。
int sum(int, int); // sum函数不在calculator前面,这里需要声明
extern int multi(int a, int b); // 这里是声明,该函数定义在另外的文件里面
int sub(int a, int b) // sub函数在calculator前面,可以不进行声明,直接调用
{
return (a - b);
}
static inline int div(int a, int b) // 只提供给当前文件的函数,用static修饰;编译时展开,用inline修饰
{
return (a / b);
}
int calculator(int a, int b)
{
printf("sum = %d\n", sum(a, b));
printf("sub = %d\n", sub(a, b));
printf("multi = %d\n", multi(a, b));
printf("div = %d\n", div(a, b));
}
int sum(int a, int b)
{
return (a + b);
}