C语言:第11天笔记
函数
函数的调用
调用方式
①函数语句:
test(); //对于无返回值的函数,直接调用
int res = max(2,4);//对于有返回值的函数,一般需要在主调函数中接受被调函数的返回值
②函数表达式:
4 + max(2,4);
scanf("%d",&num) != 1;
(c = getchar() != '\0')
③函数参数:
printf("%d",(int) fabs(number)); //函数作为实参
注意:函数可以作为函数的实参,如果要作为形参,必须使用函数指针。
在一个函数中调用另一个函数具备以下条件:
被调函数必须是已经定义的函数。
若使用库函数,应在本文件开头用
#include
包含其对应的头文件。若使用自定义函数,自定义函数又在主调函数的后面,则应在主调函数中对被调函数进行声明。声明的作用是把函数名、函数参数的个数和类型等信息通知编译系统,以便于在遇到函数时,编译系统能正确识别函数,并检查函数调用的合法性。
int max(int 5,int 6) { return 5; } int main() { max(4,5); }
函数的声明
函数调用时,往往要遵循先定义后使用,但如果我们对函数的调用操作出现在函数定义之前,则需要对函数进行声明。
定义
完整的函数使用分为三部分:
[函数声明]
int max(int x,int y,double z); //函数声明只保留函数头 int max(int,int,double); //省略参数名称
函数声明如果在同一个文件,一定要定义所有函数定义的最前面。如果有对应的
.h
文件,可以将函数的声明抽取到.h
中。函数定义
int max(int x,int y,double z) //函数定义时不能省略参数的名称 { return x > y }
函数定义的时候,不能省略形参的数据类型,参数个数,参数名称,位置要和函数声明完全一致。
函数调用
int main() { printf("%d\n",max(4,5,6)); }
作用
C语言的函数声明是为了提前告诉编译器函数的名称、返回类型和参数,这样在函数实际定义之前就能安全调用它,避免编译错误,同时检查参数和返回值是否正确。相当于给编译器一个“预告”,确保代码正确编译和运行。
使用
错误示例:被调函数写在主调函数之后
//主调函数 int main() { printf("%d\n",add(12,13));//此时编译会报错,因为函数没有经过声明,编译系统无法检查函数调用的合法性 } //被调函数 int add(int x;int y) { return x + y; }
正确演示:被调函数和主调函数无法区分前后,需要增加被调函数的函数声明
//被调函数 int add(int x;int y) { return x + y; } { printf("%d\n",add(12,13)); }
注意:如果函数的调用比较简单,如a函数调用b 函数,b函数调用a函数,无法区分前后,此时需添加函数声明。
声明的方式:
- 函数头加上分号
int add(int a, int b);
函数加上分号,可以省略形参名称,但不能省略参数类型
int add(int,int);
函数的嵌套调用
定义
函数不允许嵌套定义,但是允许嵌套调用
正确示例:函数嵌套调用
void a() {...} void b() { a(); } int main() { printf(..); }
错误示例:函数嵌套定义
void a() { void b() { ... } }
**嵌套调用:**在被调函数内又主动去调用其他函数,这样的函数调用形式,称之为嵌套调用。
案例
案例1
需求:编写一个函数,判断给定的3~100的正整数是否是素数
分析:
- 素数:素数是大于1的自然数,除了1和它本身外,不能被其他数整除。
代码
/************************************************************************* > File Name: demo01.c > Author: 刘孟丹 > Description: 求素数 > Created Time: 2025年05月16日 星期五 10时44分43秒 ************************************************************************/ #include <stdio.h> /** * 定义一个函数,求素数 * @para n:需要校验素数的整数 * @return 返回flag 1-素数,0-非素数 */ int is_prime(int n) { //默认是素数 int flag = 1; // 循环变量 for(int i = 2;i <= n/2;i++) { // 判断是否出现证除情况 if(n % i == 0) { flag = 0;//非素数 break; } } return flag; } int main(int argc,char *argv[]) { //生成3~100之间的自然数 for(int i =3; i<= 100;i++) { if(is_prime(i) == 1) printf("%-4d",i); } printf("\n"); return 0; }
运行结果
案例2:
需求:输入四个整数,找出其中最大的数,用函数嵌套来实现,要求每次只能两个数比较。
代码:
/************************************************************************* > File Name: demo02.c > Author: 小刘 > Description: > Created Time: 2025年05月16日 星期五 11时01分31秒 ************************************************************************/ #include <stdio.h> int max_2(int,int); int max_4(int,int,int,int); int main(int argc,char *argv[]) { int a,b,c,d; printf("请输入四个整数:"); scanf("%d%d%d%d",&a,&b,&c,&d); printf("最大的数为:%d\n",max_4(a,b,c,d)); return 0; } int max_2(int a,int b) { return a > b ? a : b; } int max_4(int a,int b,int c,int d) { return max_2(a,b) > max_2(c,d) ? max_2(a,b) : max_2(c,d); }
运行结果