C语言学习笔记之(函数)

一、格式

1.无参定义

定义无参函数的一般形式为:
类型说明符 函数名()
{
	函数体
}
或
类型说明符 函数名(void)
{
	函数体
}
函数名后面括号内的void表示“空”,即函数没有参数。

2.有参定义

定义有参函数的一般形式为:
类型说明符 函数名(形式参数声明)
{
	函数体
}
有参函数在函数名后的括号内必须有形式参数(简称“形参”)表,用于调用函数和被调函数之间的数据传递,故必须对其进行类型说明,这由形式参数声明部分完成。一般情况下,函数中需要多少个原始数据,函数的形参表中就应有多少个形参,每个形参存放一个数据,形参之间用逗号隔开。例如:
int min(int a,int b)
{
	int c;
	c=a<b?a:b;
	return (c);
}
这是一个求a和b两数中较小值的函数,函数的类型说明符为int型,表示函数的返回值为整型。a和b是形式参数,它接受主调函数的实际参数,两个参数的类型声明用逗号分隔。花括号内是函数体,其中,“int c;”是函数体中的数据定义,后面一条语句用于求a和b中的较小者,return语句的作用是将c的值作为函数值返回到主调函数中。

3.空函数

C语言中可以有“空函数”,它的形式为:
类型说明符 函数名(){ }
例如:
void triangle() {}
调用此函数时,什么工作也不做。在主调函数中写“triangle();”,表明这里要调用一个函数而现在这个函数不起作用,等以后扩充函数功能时再补上。

例子:用程序模拟组织学生打扫教室卫生问题,用函数调用的方式实现。

#include <stdio.h>
void window()					/*定义window函数,执行擦窗户功能*/
{
       printf("They are cleaning windows!\n");
}
void desk()					/*定义desk函数,执行擦桌子功能*/
{
       printf("They are cleaning desks!\n");
}
void floor()					/*定义floor函数,执行扫地功能*/
{       printf("They are cleaning the floor!\n");
}
int main()
{
       window();				              /*调用window函数*/
       desk();					/*调用desk函数*/
       floor();					/*调用floor函数*/
       return 0;
}

二、函数的调用

函数调用的一般形式为:
函数名(实际参数表列)
需要说明以下几点:
1.如果调用无参函数,则“实际参数表列”可以没有,但括号不能省略。
2.实际参数(简称“实参”)表中实参的类型及个数必须与形参相同,并且顺序一致。当有多个实参时,参数之间用逗号隔开。
3.实参可以是常量、有确定值的变量或表达式及函数调用。

例子1:求两个实数的平均值。

#include<stdio.h>
float average(float x,float y)		              /*定义函数用于计算两数的平均值,x和y为形参*/
{
         float av;					/*定义变量av用于存放平均值*/
         av=(x+y)/2.0;				/*求平均值*/
         return av;					/*返回av的值*/
}
int main()
{
         float a=1.8,b=2.6,c;
         c=average(a,b);			              /*实参为确定值的变量*/
         printf("The avergae of %5.2f and %5.2f is %5.2f\n",a,b,c);
         c=average(a,a+b);			              /*实参为表达式*/
         printf("The avergae of %5.2f and %5.2f is %5.2f\n",a,a+b,c);
         c=average(2.0,4.0);			              /*实参为常量*/
         printf("The avergae of 2.0 and 4.0 is %5.2f\n",c);
         c=average(c,average(a,b));	                            /*实参为函数调用*/
         printf("The avergae is %5.2f\n",c);
}

例子2:输入两个实数,用一个函数求出两数中较小数。

#include <stdio.h>
int main()
{
         float x,y,z;
         float min(float a,float b);				/*函数声明*/
         printf("Please enter two numbers:");
         scanf("%f,%f",&x,&y);
         z=min(x,y);						/*函数调用*/
         printf("min is %f\n",z);				/*输出结果*/
         return 0;
}
float min(float a,float b)					/*函数定义*/
{
         float c;
         if(a>b)						/*比较大小,将较小数赋值给c*/
	  c=b;
         else
	  c=a;
         return c;						/*返回值为c*/
}

程序第5行是对被调用的min函数的声明:

float min(float a,float b);

从程序中可以看到,main函数的位置在min函数的前面,而程序编译时是从上到下逐行进行的。如果没有对min函数的声明,当编译到程序第8行(z=min(x,y);)时,编译系统将无法确定min是不是函数名,也无法判断实参(x和y)的类型和格式是否正确,因此,在调用函数前必须对被调函数加以声明。

三、返回语句和函数返回值

1.格式

一般情况下,主调函数调用完被调函数后,都希望能够得到一个确定的值,这就是函数的返回值。在C语言中,函数返回值是通过return语句来实现的。return语句的一般形式有三种:
return (表达式);
return 表达式;
return;

2.例子:返回最小值

#include <stdio.h>
int main()
{
	float x,y,z;
	int min(float a,float b);					/*函数声明*/
	printf("Please enter two numbers:");
	scanf("%f,%f",&x,&y);
	z=min(x,y);						/*函数调用*/
	printf("min is %f\n",z);					/*输出结果*/
	return 0;
}
int min(float a,float b)					/*函数定义*/
{
               float c;
               if(a>b)						/*比较大小,将较小数赋值给c*/
		c=b;
	else
		c=a;
	return c;						/*返回值为c*/
}