函数概念函数
形如数学里的一次或二次函数,给定一个x的值返回一个y的值
C语言中也引入了函数,就是一个完成某项特定任务的一小段代码。(有时也翻译为子程序)
函数类型
1.库函数
1.1标准库和头文件
1.1.1库函数的概念
C语言的库函数并不是C语言本身的一部分,它是由编译程序根据一般用户的需要编制并提供用户使用的一组程序。如printf,scanf都是库函数。
1.1.2库函数的使用
库函数的使用需要包含头文件。如printf函数需要包含头文件<stdio.h> strlen需要包含<string.h> sqrt需要包含头文件<math,h>
举strlen例
#include <string.h>
int main()
{
char a[]="abc";
int sz=strlen(a);//计算字符串长度
printf("%d",sz);
}
1.1.3学习库函数
C/C++官方的链接:https://zh.cppreference.com/w/c/header
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/
学习库函数文档的一般格式
1.函数原型
2.函数功能介绍
3.参数和返回类型说明
4.代码举例
5.代码输出
6.相关知识链接
2.自定义函数
顾名思义自定义函数就是自己创建的函数,自定义函数使代码更具创造性
2.1自定义函数语法形式
typr hansu(形式参数)
{
语句(函数体)
}
type是函数返回类型
hansu是函数名
2.2函数举例
int add(int x,int y)//如果函数没有返回值只是显示前面的int改成void
{
return x+y;
}
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
int sum=add(a,b);
printf("%d",sum);
}
2.3形参和实参
如上张图代码所示。a和b是实参;x和y是形参
2.3.1形参(形式参数)
只有在程序执行过程中调用了函数,形参才有可能得到具体的值,并参与运算求得函数值。
2.3.2实参(实际参数)
实参可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
两者的本质区别:形参的本质是一个名字,不占用内存空间。实参的本质是一个变量,已经占用内存空间。
return语句
函数中经常会出现return 语句
1.注意事项:
• return后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果。
• return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void(上面有讲到)的情况。
• return返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型。
• return语句执行后,函数就彻底返回,后边的代码不再执行。
• 如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
嵌套调用和链式访问
1.嵌套调用
嵌套调用即函数间的互相调用
代码举例:
int is_leap_year(int y)
{
if(((y%4==0)&&(y%100!=0))||(y%400==0))
return 1;
else
return 0;
}
int get_days_of_month(int y, int m)
{
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day = days[m];
if (is_leap_year(y) && m == 2)
day += 1;
return day;
}
int main()
{
int y = 0;
int m = 0;
scanf("%d %d", &y, &m);
int d = get_days_of_month(y, m);
printf("%d\n", d);
return 0;
}
2..链式访问
链式访问即将函数的返回值作为另一个元素的参数。
#include <string.h>
int main()
{
char a[]="abc";
printf("%d",strlen(a));
return 0;
}
思考:下面两式打印的结果(可以访问上述提到的两个网址了解printf函数)
1. printf(“%d”,printf("%d",printf("%d",43)))
2. printf(“%d”,printf("%d ",printf("%d ",43)))
函数的申明和定义
一般我们将函数定义在函数调用之前。如果定义在调用在函数之后就会报错。
int main()
{
……
int sz=a();
……
}
int a(形参)
{
……
}
如果非要写在调用之后则必须在最顶上加上一句代码
int a(形参);
引申
1.多文件(一般函数的申明,类型的申明在头文件(.h),函数的实现在原文间中(.c))
多文件写代码好处:
1.方便协作
2.逻辑清晰
3.方便隐藏代码
add.h
int add(int x,int y);//函数申明
add.c
int add(int x,int y)
{
return x+y;
}
test.c
#include<stdio.h>
#include"add.h"//调用自己编写的头文件格式
int main()
{
int a= 15,b=45;
int c=a+b;
printf("%d",c);
return 0;
}
2.static和extern
1.static修饰
知识点:作用域是一个名字(a/b/sz)的可用区域
局部变量:变量所在局部范围(如上述add.c中add函数里的x和y出了函数就无定义了无法使用)
全局变量:整个工程项目
2.1局部变量
被static修饰的局部变量具有记忆功能,出了作用域不会删除。
2.2全局变量
全局变量被static修饰后,外部链接属性(可以在多个文件中使用)变成内部链接,即在目前所在源文件中使用。(作用域变小)
2.3函数
函数和全局变量一样具有外部链接属性,被static修饰后效果和全局变量一样
各变量的内存:
2.extern
用来申明外部符号,是定义的变量可以跨文件使用。
test1.c
int x( )
{
}
test.c
extern int x( )
int main()
{
……
x( )
}
如果有什么不对的地方或改进建议,欢迎在评论区留言。同时也希望小伙伴多多点赞关注,下一章讲用数组和函数实现扫雷游戏!!!!