C的设计原则是把函数作为程序的构成模块
函数(function):用于完成特定任务的程序代码的自包含单元
使用函数的好处:
1)函数的使用可以省去重复代码的编写,尤其是程序中需要多次使用某种特定的功能时,只需编写一个合适的函数,根据需要在程序的不同的地方进行调用即可
2)即使某种功能在程序中只需使用一次,以函数的形式实现该功能有利于实现程序的模块化,便于阅读和维护
函数在程序中一般至少出现3次:
1)函数原型(function prototype):告知编译器函数原型
2)函数调用(function call):执行函数功能
3)函数定义(function definition):指定函数具体功能
函数同变量一样有多种类型,任何程序在使用函数之前都需要声明该函数的类型
函数原型格式:
void function(void); // 第一个void声明函数类型,说明该函数没有返回值
// 第二个void表明函数参数类型,说明该函数不接受参数
// 分号表示该语句是进行函数声明而不是函数定义
// 该声明告诉编译器需要在其他位置找到该函数的定义
在main函数中调用函数,则函数原型可以放在main函数之前,也可以放在main函数中可以防止变量声明的位置
函数调用格式:
function(); // void类型函数的调用形式
函数定义格式:
void function(void)
{
int i; // 声明语句
for(i = 0; ... ; ...) // 控制语句
{
printf(...);
}
}
调用程序和被调用函数可以包含在同一文件,也可以放在不同文件
示例代码:
#include <stdio.h>
void print_c(void); // 函数原型
int main(void)
{
print_c(); // 函数调用
printf("hello world! \n");
print_c(); // 函数调用
return 0;
}
void print_c(void) // 函数定义
{
int i;
for(i = 0; i < 20; i++)
{
printf("*");
}
printf("\n");
}
运行结果:
一、函数参数
定义带有参数的函数:
void function(int parameter1, char parameter2, ...)
形式参数(形参):函数定义时的参数;形参时局部变量,为函数私有
ANSI C形式要求在每个变量前声明其类型
void function(int a, int b, int c) // right
void function(int a, b, c) // wrong
实际参数(实参):函数调用时对形参进行赋值
形参是被调函数中的变量,实参是调用函数分配给被调函数变量的特定数值
实参可以是常量、变量或表达式
示例代码:
#include <stdio.h>
void print_c(int num); // 函数原型
int main(void)
{
print_c(30); // 函数调用
printf("hello world! \n");
print_c(30); // 函数调用
return 0;
}
void print_c(int num) // 函数定义
{
int i;
for(i = 0; i < num; i++)
{
printf("*");
}
printf("\n");
}
运行结果:
二、函数返回值
关键字return指明其后的表达式的数值即是该函数的返回值
return语句的另一作用是终止执行函数,并把控制返回给调用函数的下一个语句;即使return语句不是函数的最后一句,执行结果也是如此
示例代码:
#include <stdio.h>
int max_cal(int a, int b);
int main(void)
{
int a, b;
printf("please enter two integers: \n");
while(scanf("%d %d", &a, &b) == 2)
{
printf("the larger of %d and %d is %d \n", a, b, max_cal(a, b));
}
printf("bye. \n");
return 0;
}
int max_cal(int a, int b)
{
if(a > b)
{
return a;
}
else
{
return b;
}
}
运行结果:
三、函数类型
函数应进行类型声明,其类型应和返回值类型相同,无返回值的函数应该被声明为void类型
类型声明是函数定义的一部分,函数类型指的是返回值类型,而不是函数参数类型
函数声明要在使用函数之前进行
不要把函数声明和函数定义混淆