第四章函数
一、为什么要用函数(函数的优点)
1、可以避免代码冗长
2、模块化的设计思路
3、按功能来划分,每个函数代表一个功能,在写代码时函数的名称要体现函数的功能含义,类似变量标识符a=f(x)
二、函数的声明
1、说明:在程序中用到的所有函数,必须“先定义,后使用”,必须事先按规范对它进行定义,指定它的名字、函数返回值的类型、函数实现的功能以及参数的个数与类型。
2、定义:抓住三要素
(1)函数名——体现功能
(2)参数列表:
1、例如 z = f(x) —— x就是参数
2、例如 z = f(x,y) —— x,y就是参数 —— 参数的个数根据需求自行定义
(3)返回值 —— 例如 y = f(x) —— y就是函数根据x的值和f的功能执行后的结果
3、函数体 —— 及执行什么样的功能,涉及的处理代码叫做函数体
三、函数的定义和调用
1、定义无参数函数
#include <stdio.h>
void printfwenzi() \\定义一个无参数的函数
{
printf("欢迎来看我的学习文章\n");
}
int main()
{
printfwenzi(); \\在函数main中调用名为printfwenzi的函数
return 0;
}
2、定义有参数有返回值的函数
#include <stdio.h>
//三要素: 返回值,参数列表,功能
int add(int data1,int data2)//函数原型
{
int ret;
ret = data1 + data2;
return ret;
}
int main()
{
int x;
int y;
int z;
printf("请输入一个数:\n");
scanf("%d",&x);
printf("请再输入一个数:");
scanf("%d",&y);
z = add(x,y); //调用函数 add
printf("%d+%d=%d\n",x,y,z);
return 0;
}
3、定义空函数
运用在程序设计,模块设计的时候,占坑
#include <stdio.h>
int initWifi()
{
}
int main()
{
int passwd;
y = f(x);
initWifi();
return 0;
}
4、函数调用
(1)函数可以当做表达式 —— 用的是它的返回值
(2)函数调用当做其他函数调用的参数 ——— 也是用它的返回值
#include <stdio.h>
//三要素: 返回值,参数列表,功能
int add(int data1,int data2,int data3)//函数原型
{
int ret;
ret = data1 + data2 + data3;
return ret;
}
int main()
{
int x;
int y;
int z;
int fret; //int ret
printf("请输入一个数:\n");
scanf("%d",&x);
printf("请再输入一个数:\n");
scanf("%d",&y);
printf("请再输入一个数:\n");
scanf("%d",&z);
fret = add(x,y,z)+100; //函数当做表达式
printf("%d+%d+%d=%d\n",x,y,z,add(x,y,z)); //函数调用当做其他函数调用的参数
printf("fret = %d\n",fret);
return 0;
}
(3)注意事项(经常会犯的错误):1、int add(1,2) —— 带了返回值类型
2、add(int a,int b) —— 形参带类型了
三、形式参数和实际参数
1、说明: 在调用有参数函数时,主调函数好被调用函数之间有数据传递关系,在定义函数时函数名称后面括号中的变量名称为“形式参数”(简称“形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面的括号中的参数称为“实际参数”(简称“实参”)。实际参数可以是常量、变量或表达式。
2、传递参数,传递的是值 —— 形参和实参值相同,但是地址空间不同
3、局部变量
4、案例
#include <stdio.h>
int bigdata(int x,int y) //定义函数 ,两个参数
{
return x>y?x:y; //三目运算符
}
int main()
{
int data1;
int data2;
int bigone;
printf("输入两个数:\n");
scanf("%d%d",&data1,&data2);
bigone = bigdata(data1,data2);
printf("两个数据是%d,%d,大数是:%d\n",data1,data2,bigone);
return 0;
}