#include <stdio.h>
// max是函数的名字,i 和 j 是形式参数,简称形参,void表示函数没有返回值
void max 1(int i, int j)
{
if (i > j)
printf ( " %d\n ", i ) ;
else
printf ( " %d\n ", j ) ;
} // 找最大值和对最大值进行处理
void max 2(int i, int j)
{
if (i > j)
return i ;
else
return j ;
} // 找最大值
int main(void)
{
int a, b, c, d, e, f;
a=1, b=2, c=3, d=-5, e=10, f=9;
max 1(a,b);
max 1(c,d);
max 1(e,f);
return 0;
}
1.为什么需要函数?
避免了重复性操作
有利于程序的模块化
2.什么叫函数?
逻辑上:能够完成特定功能的独立代码块
物理上:能够接收数据;
能够对接收的数据进行处理;
能够将数据处理的结果返回(当然也可以不反回任何值)。
总 结:函数是个工具,它是为了解决大量类似问题而设计的。
函数可以当做一个黑匣子
3.如何定义函数?
函数的返回值 函数的名字(函数形参列表)
{
函数的执行体
}
1.函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法
2.函数返回值的类型也称为函数的类型,因为如果 函数名前的返回值类型 和 函数
执行体中的 return 表达式;中表达式的类型不同的话,则最终函数返回值的类型 以
函数名前的返回值类型 为准
3.return 表达式;的含义
①终止被调函数,向主调函数返回表达式的值
②如果表达式为空,则只终止函数,不向主调函数返回任何值
如: void f ()
{
return ; // return 只用来终止函数不向主调函数返回任何值
}
int f ()
{
return 10 ; // 第一,终止函数,第二,向主调函数返回 10
}
③break是用来终止循环和switch的,return是用来终止函数的
4.函数的分类
有参函数 和 无参函数
有返回值函数 和 无返回值函数
库函数 和 用户自定义函数
值传递函数 和 地址传递函数
普通函数 和 主函数(main函数)
一个程序必须有且只能有一个主函数
主函数可以调用普通函数,普通函数不能调用主函数
普通函数可以相互调用
主函数是程序的入口,也是程序的出口
5.注意的问题
函数调用和函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明:
①告诉编译器即将可能出现的若干个字母代表的是一个函数
②告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况
③函数声明是一个语句,末尾必须加分号
④对库函数的声明是通过 # include < 库函数所在的文件名 . h > 来实现的
例如:
# include <stdio.h>
void f (void); // 函数的声明
void g (void)
{
f (); // 函数的调用
}
void f (void)
{
printf ("哈哈!\n") ;
} // 函数的定义
int main (void)
{
g( );
return 0;
}
形参和实参
个数相同,位置一一对应,数据类型必须相互兼容
如何在软件开发中合理的设计函数来解决实际问题
一个函数的功能尽量独立、单一,多学习、多模仿牛人的代码
函数是C语言的基本单位,类是JAVA、C++的基本单位
6.常用的系统函数
double sqrt (double x); 求x的平方根
int abs (int x); 求X的绝对值
double fabs (double x); 求x的绝对值
7.变量的作用域和存储方式
按作用域分:全局变量:在所有函数外部定义的变量叫全局变量
使用范围:从定义位置开始到整个程序结束
局部变量:在一个函数内部定义的变量或者函数的形参,都统称为局部变量
void f (int i)
{
int j=20;
}
i和j都属于局部变量。
使用范围:只能在本函数内部使用
注意的问题:全局变量和局部变量命名冲突的问题
在一个函数内部如果定义的局部变量的名字和全局变量的名字
一样时,局部变量会屏蔽掉全局变量
按变量的存储方式分:
静态变量
自动变量
寄存器变量