函数,是C语言中最核心的东西(在Java中叫作 "方法")。比如我们平时所编写最多的 main 函数,它是C语言中最先执行的函数,也是必须要有的函数。 main 函数可以当作为是C程序的执行入口。 当然,我们也可以自己来定义新的函数,然后在需要时可以被 main 函数所调用执行,或者是其它函数。


一。函数的定义


函数的定义格式:

[修饰符1 修饰符2 …]返回值类型 函数名(形式参数列表){ 
    语句块; 
} 

( 一 ).函数是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码,我们只需要把重复的代码写在函数里面,在需要调用。

( 二 ).函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码。函数还可以接收数据,并根据数据的不同做出不同的操作,最后再把处理结果反馈给我们。

将代码段封装成函数的过程叫做函数定义。


1.参数


函数的一个明显特征就是使用时带括号( ),有必要的话,括号中还要包含数据或变量,称为参数(Parameter)。参数是函数需要处理的数据,例如:
strlen(str1) 用来计算字符串的长度, str1 就是参数。
puts("略略略") 用来输出字符串,"略略略" 就是参数。

简单的无参函数的定义:

void main(){}

简单的有参函数的定义:

void ka(int a,int b){}


1.1形参和实参


C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。
形参(形式参数):
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数):
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。

void test(int x){ //形参: int x
    int a=10;     //实参: int a=10
}

形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。


2.返回值


既然函数可以处理数据,那就有必要将处理结果告诉我们,所以很多函数都有返回值(Return Value)。所谓返回值,就是函数的执行结果。例如:
char str1[] = "C Language";
int len = strlen(str1);
strlen() 的处理结果是字符串 str1 的长度,是一个整数,我们通过 len 变量来接收。

函数返回值有固定的数据类型(int、char、float等),用来接收返回值的变量类型要一致。

【示例】让其他函数计算结果的值返回给main函数的变量a并输出的程序:

#include <stdio.h>
int sum(){              //sum函数
    int x=0;
    for(int i=1;i<100; i++){
        x++;
    }
    return x;           //把x作为sum函数的返回值;
}
void main(){            //main函数
    int a=sum();        //sum函数的返回值赋值给a变量
    printf("a = %d",a); //输出a的结果
}
                        //最后结果为: a = 99 x = 99


二。函数的声明


函数声明格式:

[修饰符1 修饰符2 …]返回值类型 函数名(形式参数列表);

既然有了函数定义,那么函数声明的作用域是什么?

如果我们定义了 main 函数在代码最靠前位置,但由于代码是由上往下编译,而 main 函数又是最先编译的函数,如果先编译执行 main 函数将可能会导致:编译 main 函数时找不到 "其他对应函数" 的变量或表达式。

这时,我们就需要在代码最开始的地方声明函数,让编译器最先找到它们后再找 main 函数编译执行。

【代码示例1】
我们提前声明了sum函数的存在性,编译器会一开始就能找到sum函数,所以整个程序编译通过。

int sum(int begin,int end); //声明函数
#include <stdio.h>
void main(){
    sum(1,10);              
    sum(20,30);
    sum(35,45);
    return 0;
}
int sum(int begin,int end){  //定义函数
    int i;
    int sum=0;
    for(i=begin;i<=end,i++){
        sum+=i;
    }
    printf("%d到%d的和是%d\n",begin,end,sum);
}

【代码示例2】——编译不通过
我们知道,代码是从上往下编译的,而main函数又是最先被找到的函数,在 sum 函数没有被声明时,main 函数给 sum 函数传参,则会导致编译不通过(即使已经定义了这个函数)

#include <stdio.h>
void main(){
    sum(1,10);               
    sum(20,30);
    sum(35,45);
    return 0;
}
int sum(int begin,int end){  //定义了函数,但由于编译器没找到这个函数,编译报错。
    int i;
    int sum=0;
    for(i=begin;i<=end,i++){
        sum+=i;
    }
    printf("%d到%d的和是%d\n",begin,end,sum);
}

最后,需要注意: 定义和声明的函数必须同一个返回值类型,不然也会编译不通过。