C语言基础11天:函数
C语言基础:第11天笔记
内容提要
- 函数
函数
函数的概论
-
函数:实现一定功能的,独立的代码模块,我们函数一定是先定义,后使用
-
使用函数的优势:
- 1.我们可以通过函数提供功能给别人使用,当然我们也可以使用别人提供的函数,减少代码量
- 2.借助函数可以减少重复性的代码
- 3.实现结构化(模块化)程序设计思想
关于结构化设计思想: 将大型的任务功能划分为互相独立的小型的任务模块来设计
-
函数是C语言的基本组成单元
C语言程序是由一个(必然是main函数)或多个函数组成
函数的分类
-
从函数实现的角度
- 库函数:C语言标准库实现的并提供使用的函数,比如常见的有scanf(),printf(),strlen()…
- 自定义函数:需要程序员自行实现,开发中大部分函数都是自定义的
-
从函数形式的角度
-
无参函数: 函数调用时,无需传递,可有可无返回值,
-
有参函数: 函数调用时.需要参数传递数据,经常需要配套返回值来使用
相关概念:
主调函数和被调函数
-
主调函数:主动去调用其他函数的函数
-
被调函数: 被其他函数调用的函数
int main//主调函数 { printf("22");//被调函数 }
很多时候,尤其是对自定义函数来说,一个函数有可能是主调函数,又是被调函数
int fun_b() { printf("函数\n"); fun_b() } int main() { fun_(); }
-
-
-
函数的定义
定义
语法:
[返回类型] 函数名([形参列表]) --函数头 | 函数首部
{
函数体语句; --函数体,整个()包裹的内容包括返回值都属于函数体
}
函数头:
-
返回类型: 函数返回值的类型
-
函数名: 函数的名称,遵循标识符命名(不能以数字开头,只能包含字母,数字,下划线,建议:小写+下划线命名法,举例:set_count())
-
形参列表:用于接收主调函数传递的数据,如果有多个参数,使用
,
分隔,且每一个形参都需要指明类型 -
说明:
-
函数的返回类型,就是返回值的类型,两个类型可以不同,但是必须能够进行转换,举例:
double fun_a() //返回类型:double { return 12; //返回值类型:int } //相当于将int类型的12赋值给了double类型的匿名变量 double res = fun_a();
-
在c语言中还可以定义无类型(即void类型)的函数,这种函数不返回函数值(没有返回值),
void test()//此时这个函数,没有返回值
{
printf();
}
-
C语言中,函数的返回类型标识符是可以省略的,如果省略,默认返回int,举例:
//写法1:main的返回类型是int类型,默认的返回值类型是0 main() { } //写法2:等价与写法1.返回值类型是int类型,返回值是0 int main() { return 0;//如果返回类型是int,这里return 0 不写,也是返回0 }
-
函数中返回语句的形式为
return(表达式)
或者return表达式
,其作用是将表达式的值作为函数值返回给主调函数,其中表达式的类型应该与我们函数类型一致(也就是函数类型和返回值类型之间是支持隐式转换或者显式转换)
//写法1
int main()
{
return(0);
}
//写法2
int main()
{
return 0;//推荐
}
如果参数列表
中有多个形式参数,则它们之间要用,
分隔
int avg(int x, int y, int z)
{
...
}
如果形参列表中有多个形参,即使他们的类型是相,在形参列表中只能逐个进行说明
int avg(int x, int y, int z)
{
...
}
如果形参中没有参数,我们可以不写,也可以用void来表示,举例
//写法1
int main(){..} //推荐
//写法2
int main(void){}
-
一个完整c程序中的所有函数可以放在一个文件中,也可以放在多个文件中,举例:
-
同一个文件:
demo.c
#include <stidio.h> void show() { printf("'1'");``````````````````````````````````` } int mian() { show(); }
-
不同文件中:
a.h
void show(); // 头文件中只放函数的声明,也就是说只有函数头
a.c
#include "a.h" // 引入库函数,使用<>引入头文件;引入自定义函数,使用""引入头文件; void show() { printf("hello\n"); }
b.c
#include "a.h" int main() { show(); }
-
案例
案例1:
需求:计算1~n之间自然数的阶乘值
#include <stdio.h>
/**
* 求1~n的阶乘值
* 建议:我们设计的函数,尽量让被调函数改动较小,由主调函数去影响
*/
long fun_1(int n)
{
int i; // 循环变量
long s = 1; // 阶乘值
for (i = 1; i <= n; i++)
{
s *= i;
}
return s;// 返回结果给主调函数
}
int main(int argc,char *argv[])
{
printf("1~5的阶乘结果是:%ld\n",fun_1(5));
printf("1~10的阶乘结果是:%ld\n",fun_1(10));
return 0;
}
型参和实参
形参(形式参数)
函数定义时指定的参数.形参是用来接受数据的,函数定义时,系统不会为形参申请内存,只有当函数调用时,系统才会为形参申请内存,主要用于存储实际参数,并且当函数返回时,系统会自动回收为形参申请的内存资源(本质上所有函数都有一个return)
实参(实际参数)
- 函数调用时主调函数传递的数据参数(常量,符号常量,变量,表达式…只要有确定的值),实参就是传递的数据
- 实参和形参必须类型相同, 如果不同时,按赋值规定进行类型转换
- 在C语言中,参数传递必须遵循
单项值传递
实参只是将自身的值传给形参,而不是实参本身,形参的值改变不会影响实参
一个函数中可以有多个return语句,但任一个时刻只有一个return语句被执行. if(num < 0 && num >=100)
int eq(int num)
{
if(num % 2 == 0)
{
printf("%d是偶数\n",num);
return 0;
}
printf("%d是奇数\n",num)
return 0;
}
被调函数返回给主调函数的结果数据(可以是变量,常量,表达式… 只要是确定值就可以)
int fun1(int a,int b)
{
return a + b;
}
int fun2(int num)
{
if(num % 2 == 0) return 0;
return -1
}
- 返回值类型一般情况下要和函数中return语句返回的数据类型都一直,如果不一致,以函数定时指定的返回类型为标准.也就是返回值类型和实际返回值的类型可以存在转换转换关系,一般是将
返回值类型
转返回类型