当前位置 博文首页 > CW_qian的博客:7月23日笔记C语言函数2
1.函数 function 某个功能模块
?? ?c语言,函数是完成某个特定的任务
函数的名字可读性要强(比如英文名)?? ?
函数的定义
?? ?返回值类型 函数名(函数的参数)
?? ?{
?? ??? ?
?? ??? ?return 返回值;
?? ?}?
int func(int a,int b,int c)
{
?? ?return a;
}?? ?
?? ?
int func(void)
{
?? ?return 1;
}
int main()
{
?? ?func();// 可以不接收func函数的返回值
?? ?int ret = func();// 接收func函数的返回值
?? ?
?? ?ret = func(1,2,3);
?? ?
}
总结: 1.函数名前面为返回值的类型,哪怕此函数没有返回值,也要写上void?
? ? ? ? ?2.?函数的返回类型要顶格
? ? ? ? ?3.函数返回类型与函数名空一格
? ? ? ? ?4.函数参数要写(),哪怕里面没有任何内容,如果没有内容最好这样写void func(void)
? ? ? ? ?5.函数调用者调用子函数的时候,可以不接收返回值
?? ?
注意: 大括号表示函数的工作范围,如果离开此范围,数据就不属于此函数管辖
?? ?函数不能在main(){}里面实现,虽然不会报错,如果不调用,这个子函数是不会被执行的
?? ?所有函数的实现都在主函数外面实现
?? ?// 语法没问题,编程规范有问题,没有人这么写
int main()// 主函数
?? ?{
?? ??? ?void func() // 子函数
?? ??? ?{
?? ??? ??? ?printf("func\n");
?? ??? ?}
?? ??? ?
?? ??? ?func();
?? ?}??? ?return 返回值;
?? ?}?
?? ?// 正确写法
?? ?void func()
?? ?{
?? ??? ?
?? ?}
函数一定有(),哪怕没有参数例如
void func ?// 错误的写法?
{}?? ?
// 正确写法
void func()
{}
主函数调用子函数
void func()
{
?? ?printf("hello func\n");
}
int main() // 程序的入口
{
?? ?// 函数调用
?? ?// func; // 不会报错,函数的入口地址,是不会执行此函数
?? ?// 函数正确写法,函数名()
?? ?func();
?? ?
?? ?return 0;
}
// 被调用函数(子函数)?? ?
void func(int a,int b) // a,b被称为形式参数(形参)
{}
void main()// 主调用函数(主函数)
{
?? ?func(1,1);// 1,1表示实际参数(实参)?
}
函数的参数
?? ?实际实参 :在函数调用过程中,主调用函数传递给被调用函数的内容被称为实际参数
?? ?形式参数 : 被调用函数在()里定义的变量
// 函数返回值
?? ?
// 错误写法,void表示没有具体类型,所以不能接收函数的返回值
void func()
{
?? ?return 0; ?
}
// 正确写法
void func()
{
?? ?
}?? ?
return 后面的返回值要与函数名前面的返回值类型一致,否则出错?? ?
return 只能返回一个结果
写法如下
int func(int a,int b)
{
?? ?return a+b;
}
int main()
{
?? ?int ret;
?? ?ret = func(); // 注意 func的返回值类型一定和ret的值类型一致,否则报错
?? ?printf("%d\n",ret);
}
模块化函数设计之多文件封装函数
?? ?多文件编译 ?gcc main.c func1.c -o main
?? ?
?? ?练习 :? 将函数封装到单独一个c文件,实现两个数值的相加
?? ?拓展 : 用穷举法实现打印质数,如果输入的是非质数
?? ?那么则输出离它最近的最小质数
?? ?
?? ?穷举法 : 指定一个范围,判断需要处理的数值是否在这个范围内
?? ?将这个数值与这个范围内的所有其它数据做比较,满足条件则为成功
?? ?否则失败
?? ?
?? ?练习目标 :
?? ??? ?1.穷举法(算法)
?? ??? ?2.函数调用问题(函数使用的思想问题)
?? ??? ?3.函数的封装问题(函数的多文件封装问题)
?? ??? ?4.标志位问题
?? ??? ?
?? ??? ?
?? ?编译器工作原理?? ?
?? ??? ?// 程序预编译,将头文件里面的内容考到源文件(c文件)
?? ??? ?gcc main.c -o main.i -E?
?? ??? ?
?? ?多文件编译,注意如果功能函数是独立放到其它c文件,编译的时候则需要添加此文件,过程如下
?? ??? ?gcc main.c func1.c -o main
?? ??? ?
?? ?多文件编译的时候不需要和头文件一起编译?? ??? ?
?? ??? ?
?? ??? ?
?? ?头文件的作用
? ? ? ? 1.是用来存放源文件中的公共资源例如
? ? ? ? 2.全局变量声明
? ? ? ? 3.普通函数声明
? ? ? ? 4.静态函数声明
? ? ? ? 5.宏定义
? ? ? ? 6.结构体、联合体定义
? ? ? ? 7.枚举常量列表的定义
?? ??? ?
?? ?头文件定义,例如 myhead.h ?头文件是 .h 后缀
?? ??? ?一般_MYHEAD_H与文件名相同,MYHEAD_H的底杆表示.h
?? ??? ?注意_MYHEAD_H是大写(默认),当然小写也行(不建议)
?? ??? ?
?? ?#ifndef _MYHEAD_H ? //判断语句,如果没有定义这个头文件
?? ?#define ?_MYHEAD_H ?// 就定义头文件
?? ?#include <stdio.h>
?? ?// 函数声明,提前告诉编译器,等下要调用此函数
?? ?extern int func(int a,int b);
?#ifndef _MYHEAD_H ? //判断语句,如果没有定义这个头文件
?#define ?_MYHEAD_H ?// 就定义头文件
?#include <stdio.h>
?// 函数声明,提前告诉编译器,等下要调用此函数
?extern int func(int a,int b);?#endif // 头文件末尾?
static静态作用
?? ?1.静态变量
?? ??? ?static全局变量和普通变量的区别 : static全局变量的初始值只初始化一次,如果不赋值,默认初始值为0
?? ??? ??? ?为了防止它在其它文件中被使用,防止文件污染
?? ??? ??? ?
?? ?2.静态函数,static函数只在函数对应的源文件有效,不能在其它文件使用?? ??? ?
?? ??? ?static 函数声明是不需要添加static关键字,但是使用的时候需要例如
?? ??? ?extern int func(void); // 存放到头文件,函数声明
?? ??? ?static int func(void ) // 函数实现
?? ??? ?{
?? ??? ??? ?....?? ?
?? ??? ?}
?? ?
内联(lian)函数 ?inline?? ?
?? ?inline 当编译器发现某段代码右inline关键字的时候就会将这段代码插入到当前位置,加快运行效率
?? ?但是也会消耗一定的运行空间
?? ?
?? ?什么时候使用inline
?? ?(1)函数需要频繁被调用,代码最好不好超过5行
?? ?
?? ?inline函数注意事项
?? ?(1)内联函数在头文件实现,其它函数不要在头文件实现
?? ?(2)函数声明和函数实现都需要添加关键字inline,
?? ??? ?如果函数声明没有添加关键字,inline函数不生效
?? ?
递归?? ?
?? ?自己调用自己,注意需要有结束条件,否则会出现内存溢出(段错误)
?? ?