定义函数应包括:
从用户使用的角度来看,函数有两种:
从函数的形式来看,函数分为两类:
定义无参函数的一般形式为:
类型名 函数名() { 函数体 }
例:
void print_message() //定义print_message { printf("Today is Saturday"); } //函数为void类型,表示不需要带回返回值
- 对函数的“定义”和“声明”不是一回事。
- 函数的定义是指对函数功能的确立,包括指定函数的名字,函数值类型、形参的类型以及函数体等,它是一个完整的、独立的函数单位
- “声明” 的作用则是把函数的名字、函数值类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致)。!它不包含函数体。
无参函数的调用形式为:函数名()
例:print_message();
定义有参函数的一般形式为:
类型名 函数名(形式参数表列) { 函数体 }
例:
int max(int x,int y) { int z; //函数体中的声明部分 z=x>y ? x : y; return (z); }
有参函数的调用形式为:函数名(实参表列)
例:max(a,b);
- 在定义函数时函数名后面括号中的变量名称为形式参数(形参);在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为实际参数(实参)。
- 在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元。在发生函数调用时,函数中的形参被分配内存单元。
- 调用结束,形参被释放。!实参单元仍保留并维持原值,没有改变。如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值。
- C语言中,实参向形参的数据传递是“值传递”,单向传递,只有实参传给形参,而不能由形参传回来给实参。
例:输入4个整数,找出其中最大的数(用函数实现)
#include <stdio.h> int main() { int max_4(int a, int b, int c, int d); //max_4函数的声明 int a, b, c, d, max; printf("Please enter 4 integer numbers:"); scanf("%d %d %d %d",&a,&b,&c,&d); max = max_4(a, b, c, d); //调用max_4函数,得到4个数的最大者,赋给变量max printf("max=%d \n",max); return 0; } int max_4(int a, int b, int c, int d) //定义max_4函数 { int max(int x, int y); //max函数的声明 int m; m = max(a,b); //调用max函数,找出a,b中的最大者 m= max(m, b); //调用max函数,找出a,b,c中的最大者 m= max(m, d); //调用max函数,找出a,b,c,d中的最大者 return m; //函数返回值是个数中的最大者 } int max(int x, int y) //定义max函数 { return(x > y ? x : y); //函数返回值是x,y中的最大者 }
- 从程序中可以看到对函数的声明与函数定义中的函数首部基本上是相同的。因此可以简单地照写已定义的函数的首部,再加一个分号,就成为 了对函数的“声明”。在函数声明中也可以不写形参名,而只写形参的类型。 在C语言中,函数声明称为函数原型(function prototype)。使用函数原型是ANSI C的一个重要特点。它的作用主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。
#include <stdio.h> int main() { long fac(int n); //对fac函数进行声明 int n; long fact; //变量fact用来存放n!的值 printf("Please enter a integer number: \n"); //输出一行信息,请用户输入n scanf("%d", &n); //输入n if (n < 0) //当输入为负值时,判为数据异常 printf("n<0,data error!"); else //当n为0或整数时,调用函数 { fact = fac(n); printf("%d!=%ld\n",n,fact); //输出n! } return 0; } long fac(int n) //定义fac函数 { int i; long fac = 1; for (i = 1; i <= n; i++) //计算n! fac *= i; return fac; //将结果返回 }
#include <stdio.h> int main() { long fac(int n); int n; long fact; printf("Please enter a interger number: \n"); scanf("%d", &n); if (n < 0) printf("n<0,data error!"); else { fact = fac(n); printf("%d!=%ld\n",n,fact); } return 0; } long fac(int n) { long fact; if (n == 0 || n == 1) //0!和1!等于1 fact = 1; else fact = n*fac(n-1); //递归调用fac函数 return fact; }