什么叫函数?
逻辑上:能够完成特定功能的独立的代码块
物理上:
能够接收数据 [当然也能够不接收数据]
能够对接收的数据进行处理
能够将数据处理的结果返回 [当然也可以不返回]
如何定义函数?
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
1、函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法
2、return 表达式;的含义:
1>终止被调函数,向主调函数返回表达式的值
2>如果表达式为空,则只终止函数,不向主调函数返回任何值
3>break是用来终止循环和switch的,而return是用来终止函数的
例子:
void f()
{
return;//return只用来终止函数,不向主调函数返回任何值
}
int f()
{
return 10;//第一,终止函数;第二,向主调函数返回10
}
例1:return与break的区别
# include <stdio.h>
void f(void)
{
int i;
for(i=0; i<5; ++i)
{
printf("终于下雪了!\n");
// break; //8行
return; //9行
}
printf("下了一天了还在下!\n");
}
int main(void)
{
f();
return 0;
}
此时输出结果为:
当我们将第8行前边的 // 放在第9行前时(即执行第8行语句,不执行第9行语句),输出结果为:
再次强调,break是用来终止循环和switch的,而return是用来终止函数的,根据上面例子可以更加清楚的明白这一点
3、函数返回值的类型也成为函数的类型,因为如果 函数名前的返回值类型 和 函数执行体中德 return 表达式; 中表达式的类型不同的话,
则最终函数返回值的类型 以函数名前的返回值类型为准
例2:
# include <stdio.h>
int f(void)
{
return 10.5; //因为函数的返回值类型是int 所以最终f返回的是10而不是10.5
}
int main(void)
{
double x = 6.6;
x = f();
printf("%lf\n", x);
return 0;
}
最终输出结果为:
为什么需要函数?
避免了重复操作
有利于程序的模块化
总结: 函数是个工具,它是为了解决大量类似问题而设计的
函数可以当作一个黑匣子
例3:
定义6个整型变量 a、b、c、d、e、f ,分别赋值,然后判断每相邻两个数之间的大小,并将大数输出。
在不用函数(即全部代码只有一个主函数main()和输入(printf())输出(scanf())等系统函数)时,我们可以这样写代码:
# include <stdio.h>
int main(void)
{
int a, b, c, d, e, f;
a = 1, b = 2, c = 3, d = 9, e = -5, f = 100;
if (a > b)
printf("%d\n", a);
else
printf("%d\n", b);
if (c > d)
printf("%d\n", c);
else
printf("%d\n", d);
if (e > f)
printf("%d\n", e);
else
printf("%d\n", f);
return 0;
}
这样写固然可以达到我们的目的,但接连使用相同的语句却显得代码太笨重,利用率低,为减少代码量,使代码更加精炼,我们可以定义一个求最大值函数
max()
(
其实在下边的代码中我们完全可以将max改成abc等任意字符或字符串,但是为了使函数表达的意思更加清楚明白,我们一般都用与函数功能相对应的名字
),代码如下:
# include <stdio.h>
//max是函数名字,i、j是形式参数,void表示函数没有返回值
void max(int i, int j)
{
if(i > j)
printf("%d\n", i);
else
printf("%d\n", j);
}
int main(void)
{
int a, b, c, d, e, f;
a = 1, b = 2, c = 3, d = 9, e = -5, f = 100;
max(a, b);
max(c, d);
max(e, f);
return 0;
}
这个程序定义了一个
max()
函数,然后再主函数中调用了
3
次。
这两个程序最终输出的结果都是:
函数的分类
有参函数和无参函数
有返回值函数和无返回值函数
库函数和用户自定义函数
值传递函数和地址传递函数
普通函数和主函数(main函数)
一个程序必须有且仅有一个主函数
主函数可以调用普通函数,普通函数不能调用主函数
普通函数之间可以相互调用
主函数是程序的入口,也是程序的出口
例如:
int f (void) //void表示该函数不能接受数据 int表示函数返回值是整数类型
{
return 10; //向主调函数返回10
}
void g (void) //前void表示该函数没有返回值,后void表示该函数不能接受数据
{
return 0; //错误
}
在例2中,f() 是我们自定义的函数,又因为函数的返回值类型是int ,所以该函数是一个有返回值函数,最终f() 返回的是10而不是10.5,f(void) 中的void表示该函数还是一个无参函数
对于 例3,我们还可以这样写代码
例4:
# include <stdio.h>
void max1 (int i, int j)
{
if (i > j)
printf("%d \n", i);
else
printf("%d \n", j);
}
int max2 (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 = 9, e = -5, f = 100;
printf("%d\n", max2 (a, b));
printf("%d\n", max2 (c, d));
printf("%d\n", max2 (e, f));
return 0;
}
最终输出结果仍是:
这个程序看起来代码量比 例3的第二个程序的代码量多一些,但实际上计算机具体执行的语句减少了,这些程序只定义了6个变量,计算机算起来立刻就好了,但当数据增加到1000个,10000(四个零)个,100000(五个零)个甚至更多时,计算时间就会节省很多,在一些浩大的项目中,才能更加显示这样的好处。
在下面的博客中,我会继续举例说明。
【所有代码均在windows系统下VC++6.0下运行通过】
(如有错误,敬请指正)