函数【重点】
函数【C语言的第二个重点】
为什么需要函数
避免了重复性操作、避免大量重复性代码 、有利于程序的模块化
什么叫函数
逻辑上: 能够完成特定功能的独立的代码块
物理上: 能够接收数据[当然也可以不接收数据]
能够对接收的数据进行处理
能够将数据处理的结果返回[当然也可以不返回任何值]
总结: 函数是个工具,它是为了解决大量类似问题而设计的
函数可以当作一个黑匣子
如何定义函数
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
函数举例-1
// max 是函数的名字, i 和 j 是形式参数,简称形参,void表示函数没有返回值
void max(int i, int j)
{
if (i > j)
printf("%d\n",i);
else
printf("%d\n",j);
}
1、函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法
2、return 表达式的含义
1> 终止被调函数,向主调函数返回表达式的值
2> 如果表达式为空,则只终止被调函数,不向被调函数返回任何值
3> break 是用来终止循环的switch的,return 是用来终止被调函数的
例子:
void f()
{
return; //return 只用来终止函数,不向被调函数返回任何值
}
int f()
{
return 10; //第一: 终止函数, 第二: 向主调函数返回10
}
函数举例-2
# include <stdio.h>
int f(void) //括号中的 void 表示该函数不能接收数据,int 表示函数返回值是 int 类型
{
return 10; //向主调函数返回 10
}
void g(void) // 8 行 函数前面的 void 没有返回值
{
// return 0; //error 与 8行 行首的 void 矛盾
}
int main (void)
{
int j = 88;
j = f();
printf("%d\n",j);
j = g(); //error
return 0;
}
3、函数返回值的类型也称为函数的类型,因为如果函数名前的返回值类型 和 函数执行体中中的return 表达式中类型 不同的话,则最后函数返回值的类型以函数名前的返回值类型为准
例子:
int f()
{
return 10.5;//以函数名前的 int 为准,返回的是10
}
函数的分类
有参函数 和 无参函数
有返回值函数 和 无返回值函数
库函数 和 用户定义函数
值传递函数 和 地址传递函数 (计算机里只有值传递函数)
普通函数 和 主函数(main 函数)
一个程序有且只有一个主函数
主函数可以调用普通函数
普通函数不能调用主函数
普通函数可以相互调用
主函数是程序的入口,也是程序的出口
注意的问题
函数调用和函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明:
1、告诉编译器即将可能出现的若干个字母所代表的是一个函数
2、告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况
3、函数声明是一个语句,后面必须加分号
4、对库函数的声明是通过 # include <库函数所在的文件的名字.h> 来实现的
函数前置声明举例
# include <stdio.h>
// void f(void); // 函数的声明; 分号不能丢掉
void f(void) // 即使没有返回值, 也建议加上 void
{
printf("哈哈!\n");
}
int main (void)
{
f(); // f 函数没有返回值
return 0;
}
形参和实参
个数相同
位置一一对应
数据类型必须一一兼容
形参和实参举例
/*
Date: 20/04/17 18:46
Description: 检测实参 i 和形参 i是否是同一个变量
*/
# include <stdio.h>
void f(int i) //静态空间,执行结束立即释放
{
i = 99;
}
int main (void)
{
int i = 6; //局部变量
printf("i = %d\n",i);
f(i);
printf("i = %d\n",i);
return 0;
}
/*
在DEVC++中输出的结果是
----------------------
i = 6
i = 6
----------------------
总结:
所有的形参和实参不是同一个变量
修改形参的值不会影响实参的值
*/
如何在软件开发中合理的设计函数来解决实际问题
一个函数的功能尽量独立,单一
多学习,多模仿牛人的代码
函数是C语言的基本单位,类是Java,C#,C++的基本单位