一、函数概述
构成 C语言的基本单元是函数。函数中包含程序的可执行代码。
每个 C 程序的入口和出口都位于 main 函数之中。为了方便规划、组织、编写和调试,一般的做法是将一个程序划分成若干个程序模块,每一个程序模块都完成一部分功能。这样,不同的程序模块可以由不同的人来完成,从而可以提高软件的开发效率。
主函数可以调用其他函数,其他函数也可以相互调用,在 main 函数中调用其他函数,这些函数执行完毕之后又返回到 main 函数中。通常把这些被调用的函数称为下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待状态,直到被调用函数执行完毕。函数可以有参数和返回值。
#include<stdio.h>
void Move(); /*声明搬运函数*/
void Build(); /*声明建造函数*/
void Paint(); /*声明粉刷函数*/
int main()
{
Move(); /*执行搬运函数*/
Build(); /*执行建造函数*/
Paint(); /*执行粉刷函数*/
return 0;
}
/*/*/
/* 执行搬用功能 */
/**/
void Move()
{
printf("This Function can move material\n");
}
/**/
/* 执行建造功能 */
/*// */
void Build()
{
printf("This Function can build a buillding\n");
}
/*///*/
/* 执行粉刷功能 */
/*//*/
void Paint()
{
printf("This Function can paint cloth\n");
}
①一个源文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。
②库函数由 C语言系统提供,用户无需定义,在调用函数之前也不必在程序中做类型说明,只需要在程序前包含有该函数原型的头文件,即可在程序中直接调用。
③用户自定义函数,就是用户自己编写的用来实现特定功能的函数。
④在这个程序中,要使用 printf 函数首先要包含 stdio.h 头文件,然后声明 3 个自定义的函数。最后在主函数 main 中调用这 3 个函数,在主函数 main 外可以看到这 3 个函数的定义。
二、函数的定义
函数的定义是让编译器知道函数的功能。定义的函数包括函数头和函数体两部分。
1、函数头
函数头分为 3 部分
①返回值类型。返回值可以是某个 C 数据类型。
②函数名。函数名也就是函数的标识符,函数名在程序中必须是惟一的。因为是标识符,所以函数名也要遵守标识符命名规则。
③参数表。参数表可以没有变量也可以有多个变量,在进行函数调用时,实际参数将被复制到这些变量中。
2、函数体
函数体包括局部变量声明和函数的可执行代码。
前面最常提到的 main 函数介绍。
所有的 C 程序都必须有一个 main 函数。该函数已经由系统声明过了,在程序中只需要定义一下即可。main 函数的返回值为整型,可以有两个参数,一个是整数,一个是指向字符数组的指针。虽然在调用时有参数传递给 main 函数,但定义 main 函数时可以不带任何参数,除了 main 函数外,其他函数在定义和调用时,参数必须是匹配的。
1、函数定义的形式
一个函数的定义分为函数头和函数体两个部分。函数定义的语法格式如下:
返回值类型 函数名(参数列表)
{
函数体(函数实现特定功能的过程);
}
定义一个函数的代码如下:
int AddTwoNumber(int iNum1,int iNum2) /*函数头部分*/
{
/*函数体部分,实现函数的功能*/
int result; /*定义整型变量*/
result=iNum1+iNum2; /*进行加法操作*/
return result; /*返回操作结果,结束*/
}
通过代码分析一下定义函数的过程。
1、函数头
函数头用来标志一个函数代码的开始,这是一个函数的入口处。函数头分成返回值类型、函数名和参数列表 3 个部分
int(返回值类型)
AddTwoNumber(函数名)
(int iNum1,int iNum2)(参数列表)
2、函数体
函数体位于函数头下方位置,由一对大括号括起来,大括号决定了函数体的范围。函数要实现的特定功能,都是在函数体部分通过代码语句完成完成的,最后通过 return 语句返回实现的结果。
①无参函数
无参函数就是没有参数的函数。语法格式如下:
返回值类型 函数名()
{
函数体
}
通过代码来看无参函数。
void ShowTime() /*函数头*/
{
printf("it's time to show yourself!"); /*显示一条信息*/
}
②空函数
没有任何内容的函数,用来占一个位置,以后用一个编好的函数来取代它。
类型说明符 函数名()
{
}
例如,定义一个空函数,留一个位置以后再添加其中的功能。
void ShowTime() /*函数头*/
{
}
2、定义与声明
在程序中编写函数时,要求对函数进行声明,再对函数进行定义。函数的声明是让编译器知道函数的名称、参数、返回值类型等信息。函数的定义是让编译器知道函数的功能。
函数声明的格式由函数返回值类型、函数名、参数列表和分号 4 部分组合,其形式如下:
返回值类型 函数名(参数列表);
必须要用分号 “;” 作为语句的结尾
int ShowNumber(int iNumber);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
/*函数的声明*/
void ShowNumber(int iNumber);
int main()
{
int iShowNumber; /*定义整型变量*/
printf("What Number do you wanna show?\n"); /*输出提示信息*/
scanf("%d", &iShowNumber); /*输入整数*/
ShowNumber(iShowNumber); /*调用函数*/
return 0;
}
/*函数定义*/
void ShowNumber(int iNumber)
{
printf("You wanna to show the Number is:%d\n", iNumber); /*输出整数*/
}
①在 main 函数的开头进行了 ShowNumber 函数的声明,声明的作用是告知其函数将在后面进行定义。
②在 main 函数体中,首先定义一个整型的变量 iShowNumber ,之后输出一条提示消息。
③在消息提示下输入整型变量,最后调用 ShowNumber 函数进行输出操作,最后在 main 函数的定义之后就可以看到 ShowNumber 函数的定义。
如果将函数的定义放在调用函数之前,就不需要进行函数的声明。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
/*函数的定义*/
void ShowNumber(int iNumber)
{
printf("You wanna to show the Number is:%d\n", iNumber); /*输出整数*/
}
int main()
{
int iShowNumber; /*定义整型变量*/
printf("What Number do you wanna show?\n"); /*输出提示信息*/
scanf("%d", &iShowNumber); /*输入整数*/
ShowNumber(iShowNumber); /*调用函数*/
return 0;
}
三、返回语句
return 0;
这就是返回语句,返回语句有以下两个主要用途:
①利用返回语句能立即从所在的函数中退出,即返回到调用的程序中去。
②返回值能返回值,即将函数值赋给调用的表达式中。有些函数也可以没有返回值,例如,返回值类型为 void 的函数就没有返回值。
1、从函数返回
从函数返回是返回语句的第一个主要用途。在程序中,由两种方式可以终止函数的执行,并返回到调用函数的位置。第一种方法是在函数体中,从第一句一直执行到最后一句,当所有语句都执行完,程序遇到结束符号 “}” 后返回。
#include<stdio.h>
int Function(); /*声明函数*/
int main()
{
printf("this step is before the Function\n"); /*输出提示信息*/
Function(); /*调用函数*/
printf("this step is end of the Function\n"); /*输出提示信息*/
}
int Function() /*定义函数*/
{
printf("this step is in the Function\n"); /*输出提示信息*/
/*函数结束*/
}
2、返回值
在调用某个函数时,通常希望能够得到一个确定的值,就是函数的返回值。
int Minus(int iNumber1, int iNumber2)
{
int iResult; /*定义一个整型变量,用来存储返回的结果*/
iResult = iNumber1 - iNumber2;
return iResult; /*return 语句返回计算结果*/
}
int main()
{
int iResult; /*定义一个整型变量*/
iResult = Minus(9, 4); /*进行 9-4 的减法计算,并将结果赋值给变量 iResult */
return 0; /*结束程序*/
}
①函数的返回值都通过函数中的 return 语句获得,return 语句将被调用函数中的一个确定值返回到调用函数中。
②函数返回值的类型。既然函数有返回值,这个值当然应该属于某一个确定的类型,因此应在定义函数时明确指出函数返回值的类型。例如:
int Minus(int iNumber1, int iNumber2);
double Min(double dNum1,double dNum2);
char Show(char cChar);
③如果函数值的类型和 return 语句中表达式值不一致,则一函数返回值的类型为准。数值型数据可以自动进行类型转换,即函数定义的返回值类型决定最终返回值的类型。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char ShowChar()