🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆
😀欢迎来到我的代码世界~ 😁 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა
目录
一、函数是什么?
二.标准库和库函数
三.自定义函数
四.嵌套调用和链式访问
数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 y=kx+b ,k和b都是常数,给⼀个任意的x,就 得到⼀个y值。 其实在C语⾔也引⼊函数(function)的概念,有些翻译为:⼦程序,⼦程序这种翻译更加准确⼀些。C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码。这段代码是有特殊的写法和调⽤⽅法的。 C语⾔的程序其实是由⽆数个⼩的函数组合⽽成的,也可以说:⼀个⼤的计算任务可以分解成若⼲个较 ⼩的函数(对应较⼩的任务)完成。同时⼀个函数如果能完成某项特定任务的话,这个函数也是可以 复⽤的,提升了开发软件的效率。在c语言中,我们一般会见到两类函数库函数和自定义函数。
C语⾔标准中规定了C语⾔的各种语法规则,C语⾔并不提供库函数;C语⾔的国际标准ANSI C规定了⼀ 些常⽤的函数的标准,被称为标准库,那不同的编译器⼚商根据ANSI提供的C语⾔标准给出了⼀系列函数的实现。这些函数就被称为库函数。
库函数的学习和查看⼯具很多,⽐如
C/C++官⽅的链接: https://zh.cppreference.com/w/c/header
cplusplus.com: https://legacy.cplusplus.com/reference/clibrary/
我们来看一下库函数是怎么使用的:
以第一个文件为例:
eg:double sqrt (double x); 从这个函数我们可以看出一个完整的函数具有函数名,参数,返回值类型。从这个表看出为sqrt函数名,参数和返回值。
#include <stdio.h>
#include <math.h>
int main()
{
double d = 16.0;
double r = sqrt(d);
printf("%lf\n", r);
return 0;
}
了解了库函数,我们的关注度应该聚焦在⾃定义函数上,⾃定义函数其实更加重要,也能给程序员写代码更多的创造性。
其实⾃定义函数和库函数是⼀样的,形式如下:
ret_type fun_name(形式参数)
{
}
• ret_type 是函数返回类型
• fun_name 是函数名
• 括号中放的是形式参数
• {}括起来的是函数体
我们可以把函数想象成⼩型的⼀个加⼯⼚⼯⼚得输⼊原材料,经过⼯⼚加⼯才能⽣产出产品,那函 数也是⼀样的,函数⼀般会输⼊⼀些值(可以是0个,也可以是多个)经过函数内的计算,得出结果。
• ret_type 是⽤来表⽰函数计算结果的类型,有时候返回类型可以是 void ,表⽰什么都不返回
• fun_name 是为了⽅便使⽤函数;就像⼈的名字⼀样,有了名字⽅便称呼,函数有了名字⽅便调
⽤,所以函数名尽量要根据函数的功能起的有意义。
• 函数的参数就相当于,⼯⼚中送进去的原材料,函数的参数也可以是 void ,明确表⽰函数没有参
数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。
• {}括起来的部分被称为函数体,函数体就是完成计算的过程。
传递给函数的参数a和b,称为实际参数,简称实参
在函数名 Add 后的括号中写的 x 和 y 称为形式参数,简称形参
为什么叫形式参数呢?实际上,如果只是定义了 Add 函数,⽽不去调⽤的话 Add 函数的参数 x
和 y 只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。形式参数只有函数被调⽤的过程中为了存放实参传递过来的值才向内存申请空间,这个过程就是形式的实例化。
形参是实参的⼀份临时拷贝。
四.函数的举例
eg写一个加法函数,完成2个整形变量的加法操作
分析:我个们要写一个整形变量的加法操作,我们需要有一个加法函数,我们需要去调用,我们从那里调用呢,我们只能自定义一个函数。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
//输⼊
scanf("%d %d",&a,&b);//如果需要多次输入while(scanf("%d",&n)!=EOF)
//调⽤加法函数,完成a和b的相加
//求和的结果放在sum中
int sum=Add(a,b)
//输出
printf("%d\n", sum);
return 0;
}
所以,我们要去设计函数 Add需要接受2个整型类型的参数,函数的计算结果也是整形,函数名,参数,返回类型
int Add(int x, int y)
{
int z = 0;
z = x+y;
return z;
}
return 语句
在函数的设计中,函数中经常会出现return语句,这⾥讲⼀下return语句使⽤的注意事项。
• return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式的结果。
• return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。eg1
• return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。
• return语句执⾏后,函数就彻底返回,后边的代码不再执⾏。
• 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误 。 eg2
eg1
void text()
{
printf("hehe\n");
]
int main()
{
text ();
text(1);
text(100);
text(100,200)
return 0;
}
函数的参数是0个,也就是函数没有参数时,返回类型可以写为void,void在这里表明函数没有参数,也不需要参数,同时这个函数也不需要返回值。
eg2:
int text()
{
int n =0;
scanf("%d,&n");
if(n%2==1)
return 1;
}
int main
{
text();
return 0;
}
会出现这种报错
• 函数的形式参数要和函数的实参个数匹配
• 函数的实参是数组,形参也是可以写成数组形式的
• 形参如果是⼀维数组,数组⼤⼩可以省略不写
• 形参如果是⼆维数组,⾏可以省略,但是列不能省略
• 数组传参,形参是不会创建新的数组的
• 形参操作的数组和实参的数组是同⼀个数组
写⼀个函数对将⼀个整型数组的内容,全部置为-1,再写⼀个函数打印数组的内容。
void set_arr(int arr[], int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
arr[i] = -1;
}
void print_arr(int arr[], int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr)/sizeof(arr[0])
set_arr(arr, sz);//设置数组内容为-1
print_arr(arr, sz);//打印数组内容
return 0;
}
嵌套调⽤就是函数之间的互相调⽤,每个函数就⾏⼀个乐⾼零件,正是因为多个乐⾼的零件互相⽆缝 的配合才能搭建出精美的乐⾼玩具,也正是因为函数之间有效的互相调⽤,最后写出来了相对⼤型的程序
写一个程序 我们计算某年某月有多少天
分析这个个很有意思的程序1.我们首先得确定年份是闰年吗?2.然后我们再根据月计算月的天数
通过is_leap_year()确定年份是什么年然后在通过get_days_of_month()确定天数
int is_leap_year(int y)
{
if(((y%4==0)&&(y%100!=0))||(y%400==0))
return 1;
else
return 0;
}
我们先判断了闰年然后去判断月份我们去使用嵌套。我们利用数组去放进12月份的所有天,我们通过数组的编号去分别编排,需要注意的编号从0开始,所以我们在存放数据时,我们应该添加一个0然后为31.28.31.30.31.30.31.31.30.3.30.31,然后有的人就要问有时2月的年份是28天,你一个29天,这能完整吗,我们可以使用if语句去单独调整。
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;
}
所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数,像链条⼀样将函数串起来就是函数。
我们可以看一段有趣的代码来理解
1 #include <stdio.h>
2 int main()
3 {
4 printf("%d", printf("%d", printf("%d", 43)));
5 return 0;
6 }
这段代码打印的结果大家认为是什么呢?
第三个printf打印43,在屏幕上打印2个字符,再返回2 第⼆个printf打印2,在屏幕上打印1个字符,再放回1 第⼀个printf打印1 所以屏幕上最终打印:4321 返回类型是字符
五.函数的使用
1.函数的定义
2.函数的声明(如果函数的定义在后面,则必须要声明函数)
3.函数的调用
functionName(param1, param2, param3 ...);
最后一个问题;在大厂为什么要分模块写代码呢?
1.逻辑清晰
2.方便协作
👍如果想知道答案,请持续关注🥇系列专栏:c语言从基础到进阶
🎁🎁🎁今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力!