单片机原理与接口技术第 3章第 3章 C51 函数
在高级语言中,函数和另外两个名词
,子程序,,,过程,用来描述同样的事情;在 Cx51中,使用,函数,这个术语 。 它们都含有以同样的方法重复地去做某件事的意思 。
第 3章 C51 函数主程序 maln( )
主程序 maln( )可以根据需要用来调用函数 。
当函数执行完毕时,就发出返回 ( return)
指令,而主程序 main( ) 用后面的指令来恢复主程序流的执行 。 同一个函数可以在不同的地方被调用,并且函数可以重复使用 。
第 3章 C51 函数函数
所谓函数,就是将一些语句集合起来,
完成一个特定的功能。函数也相当于其它编程语言中的子程序。 C语言中将函数分为主函数和其它函数。
第 3章 C51 函数函数调用的一般规则
所有的函数在定义时都是相互独立的,
一个函数中不能再定义其他函数,即函数不能嵌套定义,但可以互相调用。函数调用的一般规则是:主函数可以调用其它普通函数;普通函数之间也可以互相调用,但普通函数不能调用主函数。
第 3章 C51 函数
3.1 函数的分类从 C 语言程序的结构上划分,C 语言函数分为主函数和普通函数两种。从用户使用的角度划分,又可分为两类:
一类是标准库函数,另一类是用户自定义函数。
第 3章 C51 函数
3,1,1.标准库函数
C 语言系统一般都具有功能强大、资源丰富的标准函数库。因此,作为系统的使用者,在进行程序设计时,应该善于充分利用这些功能强大、内容丰富的标准库函数资源,以提高效率,节省时间。
第 3章 C51 函数
3.1.2.用户自定义函数用户自定义函数,顾名思义,是用户根据自己的需要编写的函数。
从函数定义的形式上划分可以有三种形式:无参数函数、有参数函数和空函数。
第 3章 C51 函数无参数函数:
此种函数在被调用时,既无参数输人,
也不返回结果给调用函数。它是为完成某种操作而编写的。
第 3章 C51 函数有参数函数:
在调用此种函数时,必须提供实际的输人参数。此种函数在被调用时,必须说明与实际参数一一对应的形式参数,并在函数结束时返回结果,供调用它的函数使用。
第 3章 C51 函数此种函数体内无语句,是空白的 。 调用此种空函数时,什么工作也不做,不起任何作用 。 而定义这种函数的目的并不是为了执行某种操作,而是为了以后程序功能的扩充 。
空函数:
第 3章 C51 函数
3.1.3 函数的定义按函数定义的形式划分。函数有三种形式:无参数函数、有参数函数和空函数下面讨论这三种函数的具体定义方法。
第 3章 C51 函数
1.无参数函数的定义方法无参数函数的定义形式为返回值类型标识符 函数名( )
{ 函数体语句 }
无参数函数一般不带返回值,因此,函数返回值类型识别符可以省略。
第 3章 C51 函数例 3-1:
试编写一段程序,使 P1口驱动的 8个发光二极管亮一秒钟,再灭一秒钟,周而复始,闪烁不止。电路如图 3-1所示。
第 3章 C51 函数图 3-1从 P3口输出数据第 3章 C51 函数应用程序:
# include <stdio,h >
void delay(void )
{ unsigned int a;
a=0;
while (a<50000)
a++
}
第 3章 C51 函数
main ( )
{ while(1)
{ P1=0;
delay();
P1=0xff;
delay();
}
}
第 3章 C51 函数
2.有参数函数的定义方法有参数函数的定义形式为返回值类型识别符 函数名(形式参数列表)
形式参数说明
{函数体语句}
第 3章 C51 函数试编写一段程序,使 P3口驱动的发光二极管亮一秒,再灭两秒,周而复始,
闪烁不止。
例 3-2:
第 3章 C51 函数
# include <stdio,h >
main ( )
{ while(1)
{P1=0;
delay(20);
P1=0xff;
delay(40);
}
}
第 3章 C51 函数
char delay(char k )
{ unsigned int a,b;
for (a=0;a<k;a++)
for (b=0;b<4000;b++);
}
第 3章 C51 函数程序分析上面程序中,实际定义了两个函数
main ()和 delay ()。主程序中调用延时函数时,向延时函数传递了一个参数,延时时间的长短取决于参数的大小,参数的类型为字符型 char。主程序两次调用延时函数时,
传递的参数不一样。使得延时时间不一样。
这里发光二极管亮的时间为 1秒,灭的时间为 2秒。
第 3章 C51 函数
3.2 C语言程序的一般组成结构
C语言程序是由一个个函数构成的。
在构成 C语言程序的若干个函数中,必有一个是主函数 main( )。
第 3章 C51 函数一个 C 程序的执行从 main ( )函数开始,
调用其他函数后返回到主函数 main ( )中,
最后在主函数 main ( )中结束整个 C 程序的运行。
在主函数中结束整个 C 程序的运行第 3章 C51 函数
C语言程序的一般组成结构下面所示为 C语言程序的一般组成结构。
全程变量说明
main( ) / * 主函数 * /
{局部变量说明执行语句
}
第 3章 C51 函数
Function_ l (形式参数表) / *函数 1 * /
形式参数说明
{局部变量说明执行语句
}
……
第 3章 C51 函数
function_n (形式参数表) / * 函数 n * /
形式参数说明
{ 局部变量说明执行语句
}
第 3章 C51 函数
3.2.1主函数主函数是 C语言程序的开头,也就是说 C语言都是从主函数开始执行的,
main的数据格式是 viod;无论何时都没有返回值。
第 3章 C51 函数例 3-3:试编写一段延时程序。
应用程序:
main()
{ char a;
for (a=1;a<100; a++);
}
第 3章 C51 函数
3.2.2其它函数除了主函数 main外,C语言的其他函数可归类为下列四大类:
(1)无参数输入,无参数返回
(2)无参数输入,有参数返回
(3)有参数输入,无参数返回
(4)有参数输入,有参数返回第 3章 C51 函数
1、无参数输入,无参数返回这种函数在调用时,无须输入任何参数给函数,而函数结束时也无须返回任何参数。
例 3-4:试编写一段程序调用延时程序。
第 3章 C51 函数应用程序
main()
{delay( );
}
void delay(void)
{char a;
for (a=1;a<100; a++);
}
第 3章 C51 函数
2、无参数输入,有参数返回此类函数在调用时无须输入任何参数,
而函数结束时却要返回一个变量值,也可以是常量,但要注意,函数的数据格式与返回变量的数据格式须保持一致,常量也是如此。
第 3章 C51 函数例 3-5:
试编写一段程序调用延时程序,延时函数结束时,返回一个参数。
第 3章 C51 函数应用程序
main()
{char k;
k=delay( );
}
char delay(void)
{char a;
for (a=1;a<100; a++);
return a;
}
第 3章 C51 函数
3、有参数输入,无参数返回在调用这种函数时,可以输入一个或多个参数,传送参数的方法有多种,但多数情况下,调用函数向被调用函数以形式参数的方法来传递。编写函数时,一般在对其说明和定义时就规定了形式参数的类型,在调用时这些函数参数必须与子函数中的形式参数的数据类型保持一致,参数的顺序和数量也要完全相同。
第 3章 C51 函数试编写一段程序,调用延时程序时,
给函数传递一个参数。
例 3-6:
第 3章 C51 函数应用程序
main()
{delay(4 );
}
void delay(char j )
{char a;
for (a=1;a<j; a++);
}
第 3章 C51 函数
4、有参数输入,有参数返回在调用这种函数时,需要输入一个或多个参数,函数向被调用函数以形式参数的方法传递。编写函数时,被传递参数的类型要与子函数中的形式参数的数据类型保持一致,参数的顺序和数量也要完全相同。返回参数时,被返回的参数要与接收参数的变量的数据类型保持一致。
第 3章 C51 函数例 3-7:
试编写一段程序,调用延时程序时,
给函数传递一个参数,延时程序结束时,
返回一个参数。
第 3章 C51 函数应用程序
main()
{char k;
k=delay(4 );
}
char delay(char j )
{char a;
for (a=1;a<j; a++);
a=200;
return a;
}
第 3章 C51 函数
3.3函数的参数和函数值
C 语言采用函数之间的参数传递方式,
使一个函数能对不同的变量进行功能相同的处理,从而大大提高了函数的通用性与灵活性。
函数之间的参数传递,由函数调用时,
主调用函数的实际参数与被调用函数的形式参数之间进行数据传递来实现。
第 3章 C51 函数返回给调用函数被调用函数的最后结果由被调用函数的 return语句返回给调用函数。
第 3章 C51 函数
3,3,1.形式参数和实际参数形式参数:
在定义函数时,函数名后面括号中的变量名称为“形式参数”,简称形参。
实际参数:
在函数调用时,主调用函数名后面括号中的表达式称为“实际参数”,简称实参。
第 3章 C51 函数应用程序
main()
{char i;
i=delay(500);
}
char delay(char j )
{char a;
for (a=1;a<j; a++);
return a;
}
第 3章 C51 函数
3,3,2,函数的返回值
main ( )
{ char i;
i=gcd(a,b)
}
char gcd(char u,char v)
{ if (u>v)
return (u)
else
return (v);
}
第 3章 C51 函数例 3-8:
试编写一段程序,用 P31控制 P1口驱动的 8个发光二极管亮一秒钟,再灭两秒钟秒钟,周而复始,闪烁不止。如果开关
k断开,发光二极管停止闪烁。
第 3章 C51 函数图 3-2用 P31控制 P1口输出数据第 3章 C51 函数应用程序:
# include <stdio,h >
main ( )
{ char i;
while(1)
{P1=0xff;
if (i==0)
continue;
i=delay(40);
P1=0x00;
i=delay(20);
}
}
第 3章 C51 函数
char delay(char k )
{ unsigned int a,b;
for (a=0;a<k;a++)
for (b=0;b<4000;b++)
if (p31 = = 0)
return (0)
else
return (1);
}
第 3章 C51 函数程序分析在 delay 函数的结尾处根据 P31值返回不同的常数 0或 1。 函数的返回值是通过函数中的 return 语句获得的。一个函数可以有一个以上的 return语句,但多于一个的 return语句必须在选择结构( if 或 do
/ case)中使用,因为被调用函数一次只能返回一个变量值。
第 3章 C51 函数
return语句的返回值可以是表达式
return语句中的返回值也可以是一个表达式,例如,可以使用冒号,:”选择表达式,如:
return (x>y?x,y)
当 x>y 为真时,返回 x 值;
否则,返回 y 值。
第 3章 C51 函数
3.4函数的调用
3.4.1 函数调用的一般形式函数调用的一般形式为:
函数名(实际参数表列) ;
第 3章 C51 函数有参数型函数对于有参数型函数,若包含多个实际参数,则应将各参数之间用逗号分隔开。
主调用函数的数目与被调用函数的形式参数的数目应该相等。实际参数与形式参数按实际顺序一一对应传递数据。
第 3章 C51 函数无参数函数如果调用的是无参数函数,则实际参数表可以省略,但函数名后面必须有一对空括号。
第 3章 C51 函数
3.4.2 函数调用的方式主调用函数对被调用函数的调用可以有以下三种方式。
第 3章 C51 函数
(1)函数调用语句即把被调用函数名作为主调用函数中的一个语句。
例 delay ( ) ;
此时并不要求被调用函数返回结果数值,只要求函数完成某种操作。
第 3章 C51 函数
(2)函数结果作为表达式的运算对象例 k=2 * delay(20);
此时被调用函数以一个运算对象的身份出现在一个表达式中。这就要求被调用函数带有 return语句,以便返回一个明确的数值参加表达式的运算。被调用函数 delay 为表达式的一部分。它的返回值乘 2 再赋给变量 k 。
第 3章 C51 函数
(3)被调函数作为另一个函数的参数这种函数的调用方法是将被调函数作为另一个函数的实际参数。
a=delay1s(delay10ms(100));
其中,delay10ms是调用了 10ms的延时程序,它有一个返回值,该值又作为另一个函数调用 delay1s()的实际参数。
通过反复调用最后达到延时 1秒的功能。
第 3章 C51 函数在一个函数中调用另一个函数必须具有以下条件:
1)被调用函数必须是已经存在的函数
(库函数或用户自定义函数)。
3.4.3 对被调用函数的说明第 3章 C51 函数程序的开头处使用# include
2)如果程序中使用了库函数,或使用了不在同一文件中的另外的自定义函数,
则应该在程序的开头处使用# include包含语句,将所用的函数信息包括到程序中来。
例,# include,stdio.h”
第 3章 C51 函数
# include,stdio.h”
将标准输入、输出头文件(在函数库中)包含到程序中来。
第 3章 C51 函数将函数库中专用数学库的函数包含到程序中来。
这样在程序编译时,系统就会自动将函数库中的有关函数调入到程序中去,
编译出完整的程序代码。
#include,math.h”
第 3章 C51 函数使用自定义函数
3)如果程序中使用自定义函数,且该函数与调用它的函数同在一个文件中,则应根据主调用函数与被调用函数在文件中的位置,决定是否对被调用函数作出说明。
第 3章 C51 函数被调用函数出现在主调用函数之后
① 如果被调用函数出现在主调用函数之后,一般应在主调用函数中,在对被调用函数调用之前,对被调用函数的返回值类型作出说明。一般的形式为,
返回值类型说明符被调用函数的函数名 ( ) ;
第 3章 C51 函数例 3-9:
试编写一段程序,调用函数时可以传递参数。
第 3章 C51 函数应用程序
main( )
{ int delay( );
int a = 0,b =10,m ;
for (;a<100;a++)
delay(a);
m = delay (b);
printf("max=%d\n",m);
}
int delay(x)
int x;
{ return(x );
}
第 3章 C51 函数被调用函数的定义出现在主调用函数之前
② 如果被调用函数的定义出现在主调用函数之前,可以不对被调用函数加以说明。因为 C 编译器在编译主调用函数之前,
已经预先知道已定义了被调用函数的类型,
并自动加以处理。
第 3章 C51 函数例 3-10:
试编写一段程序,调用函数时可以传递可以传递多个参数。
第 3章 C51 函数
int delay(x,y)
int a;b
{for (a=0; a<x; a++)
for (b=0; b<y; b++);
if(x>y)
return(a)
else
return(b);
}
main ( )
{int m = 60,n = 55,k;
k= delay(m,n);
}
第 3章 C51 函数被调用函数的定义在所有函数定义之前
③ 如果在所有函数定义之前,在文件的开头处,在函数的外部已经说明了函数的类型,则在主调用函数中不必对所调用的函数再作返回值类型说明。
第 3章 C51 函数说明例 3-11,试编写一段程序,调用函数时可以传递可以传递多个参数。
第 3章 C51 函数
int delay( )
main ( )
{ int k;
k= delay(10,20);
}
delay(x,y)
int a;b
{ for (a=0; a<x; a++)
for (b=0; b<y; b++);
if(x>y)
return(a)
else
return(b);
}
第 3章结束
在高级语言中,函数和另外两个名词
,子程序,,,过程,用来描述同样的事情;在 Cx51中,使用,函数,这个术语 。 它们都含有以同样的方法重复地去做某件事的意思 。
第 3章 C51 函数主程序 maln( )
主程序 maln( )可以根据需要用来调用函数 。
当函数执行完毕时,就发出返回 ( return)
指令,而主程序 main( ) 用后面的指令来恢复主程序流的执行 。 同一个函数可以在不同的地方被调用,并且函数可以重复使用 。
第 3章 C51 函数函数
所谓函数,就是将一些语句集合起来,
完成一个特定的功能。函数也相当于其它编程语言中的子程序。 C语言中将函数分为主函数和其它函数。
第 3章 C51 函数函数调用的一般规则
所有的函数在定义时都是相互独立的,
一个函数中不能再定义其他函数,即函数不能嵌套定义,但可以互相调用。函数调用的一般规则是:主函数可以调用其它普通函数;普通函数之间也可以互相调用,但普通函数不能调用主函数。
第 3章 C51 函数
3.1 函数的分类从 C 语言程序的结构上划分,C 语言函数分为主函数和普通函数两种。从用户使用的角度划分,又可分为两类:
一类是标准库函数,另一类是用户自定义函数。
第 3章 C51 函数
3,1,1.标准库函数
C 语言系统一般都具有功能强大、资源丰富的标准函数库。因此,作为系统的使用者,在进行程序设计时,应该善于充分利用这些功能强大、内容丰富的标准库函数资源,以提高效率,节省时间。
第 3章 C51 函数
3.1.2.用户自定义函数用户自定义函数,顾名思义,是用户根据自己的需要编写的函数。
从函数定义的形式上划分可以有三种形式:无参数函数、有参数函数和空函数。
第 3章 C51 函数无参数函数:
此种函数在被调用时,既无参数输人,
也不返回结果给调用函数。它是为完成某种操作而编写的。
第 3章 C51 函数有参数函数:
在调用此种函数时,必须提供实际的输人参数。此种函数在被调用时,必须说明与实际参数一一对应的形式参数,并在函数结束时返回结果,供调用它的函数使用。
第 3章 C51 函数此种函数体内无语句,是空白的 。 调用此种空函数时,什么工作也不做,不起任何作用 。 而定义这种函数的目的并不是为了执行某种操作,而是为了以后程序功能的扩充 。
空函数:
第 3章 C51 函数
3.1.3 函数的定义按函数定义的形式划分。函数有三种形式:无参数函数、有参数函数和空函数下面讨论这三种函数的具体定义方法。
第 3章 C51 函数
1.无参数函数的定义方法无参数函数的定义形式为返回值类型标识符 函数名( )
{ 函数体语句 }
无参数函数一般不带返回值,因此,函数返回值类型识别符可以省略。
第 3章 C51 函数例 3-1:
试编写一段程序,使 P1口驱动的 8个发光二极管亮一秒钟,再灭一秒钟,周而复始,闪烁不止。电路如图 3-1所示。
第 3章 C51 函数图 3-1从 P3口输出数据第 3章 C51 函数应用程序:
# include <stdio,h >
void delay(void )
{ unsigned int a;
a=0;
while (a<50000)
a++
}
第 3章 C51 函数
main ( )
{ while(1)
{ P1=0;
delay();
P1=0xff;
delay();
}
}
第 3章 C51 函数
2.有参数函数的定义方法有参数函数的定义形式为返回值类型识别符 函数名(形式参数列表)
形式参数说明
{函数体语句}
第 3章 C51 函数试编写一段程序,使 P3口驱动的发光二极管亮一秒,再灭两秒,周而复始,
闪烁不止。
例 3-2:
第 3章 C51 函数
# include <stdio,h >
main ( )
{ while(1)
{P1=0;
delay(20);
P1=0xff;
delay(40);
}
}
第 3章 C51 函数
char delay(char k )
{ unsigned int a,b;
for (a=0;a<k;a++)
for (b=0;b<4000;b++);
}
第 3章 C51 函数程序分析上面程序中,实际定义了两个函数
main ()和 delay ()。主程序中调用延时函数时,向延时函数传递了一个参数,延时时间的长短取决于参数的大小,参数的类型为字符型 char。主程序两次调用延时函数时,
传递的参数不一样。使得延时时间不一样。
这里发光二极管亮的时间为 1秒,灭的时间为 2秒。
第 3章 C51 函数
3.2 C语言程序的一般组成结构
C语言程序是由一个个函数构成的。
在构成 C语言程序的若干个函数中,必有一个是主函数 main( )。
第 3章 C51 函数一个 C 程序的执行从 main ( )函数开始,
调用其他函数后返回到主函数 main ( )中,
最后在主函数 main ( )中结束整个 C 程序的运行。
在主函数中结束整个 C 程序的运行第 3章 C51 函数
C语言程序的一般组成结构下面所示为 C语言程序的一般组成结构。
全程变量说明
main( ) / * 主函数 * /
{局部变量说明执行语句
}
第 3章 C51 函数
Function_ l (形式参数表) / *函数 1 * /
形式参数说明
{局部变量说明执行语句
}
……
第 3章 C51 函数
function_n (形式参数表) / * 函数 n * /
形式参数说明
{ 局部变量说明执行语句
}
第 3章 C51 函数
3.2.1主函数主函数是 C语言程序的开头,也就是说 C语言都是从主函数开始执行的,
main的数据格式是 viod;无论何时都没有返回值。
第 3章 C51 函数例 3-3:试编写一段延时程序。
应用程序:
main()
{ char a;
for (a=1;a<100; a++);
}
第 3章 C51 函数
3.2.2其它函数除了主函数 main外,C语言的其他函数可归类为下列四大类:
(1)无参数输入,无参数返回
(2)无参数输入,有参数返回
(3)有参数输入,无参数返回
(4)有参数输入,有参数返回第 3章 C51 函数
1、无参数输入,无参数返回这种函数在调用时,无须输入任何参数给函数,而函数结束时也无须返回任何参数。
例 3-4:试编写一段程序调用延时程序。
第 3章 C51 函数应用程序
main()
{delay( );
}
void delay(void)
{char a;
for (a=1;a<100; a++);
}
第 3章 C51 函数
2、无参数输入,有参数返回此类函数在调用时无须输入任何参数,
而函数结束时却要返回一个变量值,也可以是常量,但要注意,函数的数据格式与返回变量的数据格式须保持一致,常量也是如此。
第 3章 C51 函数例 3-5:
试编写一段程序调用延时程序,延时函数结束时,返回一个参数。
第 3章 C51 函数应用程序
main()
{char k;
k=delay( );
}
char delay(void)
{char a;
for (a=1;a<100; a++);
return a;
}
第 3章 C51 函数
3、有参数输入,无参数返回在调用这种函数时,可以输入一个或多个参数,传送参数的方法有多种,但多数情况下,调用函数向被调用函数以形式参数的方法来传递。编写函数时,一般在对其说明和定义时就规定了形式参数的类型,在调用时这些函数参数必须与子函数中的形式参数的数据类型保持一致,参数的顺序和数量也要完全相同。
第 3章 C51 函数试编写一段程序,调用延时程序时,
给函数传递一个参数。
例 3-6:
第 3章 C51 函数应用程序
main()
{delay(4 );
}
void delay(char j )
{char a;
for (a=1;a<j; a++);
}
第 3章 C51 函数
4、有参数输入,有参数返回在调用这种函数时,需要输入一个或多个参数,函数向被调用函数以形式参数的方法传递。编写函数时,被传递参数的类型要与子函数中的形式参数的数据类型保持一致,参数的顺序和数量也要完全相同。返回参数时,被返回的参数要与接收参数的变量的数据类型保持一致。
第 3章 C51 函数例 3-7:
试编写一段程序,调用延时程序时,
给函数传递一个参数,延时程序结束时,
返回一个参数。
第 3章 C51 函数应用程序
main()
{char k;
k=delay(4 );
}
char delay(char j )
{char a;
for (a=1;a<j; a++);
a=200;
return a;
}
第 3章 C51 函数
3.3函数的参数和函数值
C 语言采用函数之间的参数传递方式,
使一个函数能对不同的变量进行功能相同的处理,从而大大提高了函数的通用性与灵活性。
函数之间的参数传递,由函数调用时,
主调用函数的实际参数与被调用函数的形式参数之间进行数据传递来实现。
第 3章 C51 函数返回给调用函数被调用函数的最后结果由被调用函数的 return语句返回给调用函数。
第 3章 C51 函数
3,3,1.形式参数和实际参数形式参数:
在定义函数时,函数名后面括号中的变量名称为“形式参数”,简称形参。
实际参数:
在函数调用时,主调用函数名后面括号中的表达式称为“实际参数”,简称实参。
第 3章 C51 函数应用程序
main()
{char i;
i=delay(500);
}
char delay(char j )
{char a;
for (a=1;a<j; a++);
return a;
}
第 3章 C51 函数
3,3,2,函数的返回值
main ( )
{ char i;
i=gcd(a,b)
}
char gcd(char u,char v)
{ if (u>v)
return (u)
else
return (v);
}
第 3章 C51 函数例 3-8:
试编写一段程序,用 P31控制 P1口驱动的 8个发光二极管亮一秒钟,再灭两秒钟秒钟,周而复始,闪烁不止。如果开关
k断开,发光二极管停止闪烁。
第 3章 C51 函数图 3-2用 P31控制 P1口输出数据第 3章 C51 函数应用程序:
# include <stdio,h >
main ( )
{ char i;
while(1)
{P1=0xff;
if (i==0)
continue;
i=delay(40);
P1=0x00;
i=delay(20);
}
}
第 3章 C51 函数
char delay(char k )
{ unsigned int a,b;
for (a=0;a<k;a++)
for (b=0;b<4000;b++)
if (p31 = = 0)
return (0)
else
return (1);
}
第 3章 C51 函数程序分析在 delay 函数的结尾处根据 P31值返回不同的常数 0或 1。 函数的返回值是通过函数中的 return 语句获得的。一个函数可以有一个以上的 return语句,但多于一个的 return语句必须在选择结构( if 或 do
/ case)中使用,因为被调用函数一次只能返回一个变量值。
第 3章 C51 函数
return语句的返回值可以是表达式
return语句中的返回值也可以是一个表达式,例如,可以使用冒号,:”选择表达式,如:
return (x>y?x,y)
当 x>y 为真时,返回 x 值;
否则,返回 y 值。
第 3章 C51 函数
3.4函数的调用
3.4.1 函数调用的一般形式函数调用的一般形式为:
函数名(实际参数表列) ;
第 3章 C51 函数有参数型函数对于有参数型函数,若包含多个实际参数,则应将各参数之间用逗号分隔开。
主调用函数的数目与被调用函数的形式参数的数目应该相等。实际参数与形式参数按实际顺序一一对应传递数据。
第 3章 C51 函数无参数函数如果调用的是无参数函数,则实际参数表可以省略,但函数名后面必须有一对空括号。
第 3章 C51 函数
3.4.2 函数调用的方式主调用函数对被调用函数的调用可以有以下三种方式。
第 3章 C51 函数
(1)函数调用语句即把被调用函数名作为主调用函数中的一个语句。
例 delay ( ) ;
此时并不要求被调用函数返回结果数值,只要求函数完成某种操作。
第 3章 C51 函数
(2)函数结果作为表达式的运算对象例 k=2 * delay(20);
此时被调用函数以一个运算对象的身份出现在一个表达式中。这就要求被调用函数带有 return语句,以便返回一个明确的数值参加表达式的运算。被调用函数 delay 为表达式的一部分。它的返回值乘 2 再赋给变量 k 。
第 3章 C51 函数
(3)被调函数作为另一个函数的参数这种函数的调用方法是将被调函数作为另一个函数的实际参数。
a=delay1s(delay10ms(100));
其中,delay10ms是调用了 10ms的延时程序,它有一个返回值,该值又作为另一个函数调用 delay1s()的实际参数。
通过反复调用最后达到延时 1秒的功能。
第 3章 C51 函数在一个函数中调用另一个函数必须具有以下条件:
1)被调用函数必须是已经存在的函数
(库函数或用户自定义函数)。
3.4.3 对被调用函数的说明第 3章 C51 函数程序的开头处使用# include
2)如果程序中使用了库函数,或使用了不在同一文件中的另外的自定义函数,
则应该在程序的开头处使用# include包含语句,将所用的函数信息包括到程序中来。
例,# include,stdio.h”
第 3章 C51 函数
# include,stdio.h”
将标准输入、输出头文件(在函数库中)包含到程序中来。
第 3章 C51 函数将函数库中专用数学库的函数包含到程序中来。
这样在程序编译时,系统就会自动将函数库中的有关函数调入到程序中去,
编译出完整的程序代码。
#include,math.h”
第 3章 C51 函数使用自定义函数
3)如果程序中使用自定义函数,且该函数与调用它的函数同在一个文件中,则应根据主调用函数与被调用函数在文件中的位置,决定是否对被调用函数作出说明。
第 3章 C51 函数被调用函数出现在主调用函数之后
① 如果被调用函数出现在主调用函数之后,一般应在主调用函数中,在对被调用函数调用之前,对被调用函数的返回值类型作出说明。一般的形式为,
返回值类型说明符被调用函数的函数名 ( ) ;
第 3章 C51 函数例 3-9:
试编写一段程序,调用函数时可以传递参数。
第 3章 C51 函数应用程序
main( )
{ int delay( );
int a = 0,b =10,m ;
for (;a<100;a++)
delay(a);
m = delay (b);
printf("max=%d\n",m);
}
int delay(x)
int x;
{ return(x );
}
第 3章 C51 函数被调用函数的定义出现在主调用函数之前
② 如果被调用函数的定义出现在主调用函数之前,可以不对被调用函数加以说明。因为 C 编译器在编译主调用函数之前,
已经预先知道已定义了被调用函数的类型,
并自动加以处理。
第 3章 C51 函数例 3-10:
试编写一段程序,调用函数时可以传递可以传递多个参数。
第 3章 C51 函数
int delay(x,y)
int a;b
{for (a=0; a<x; a++)
for (b=0; b<y; b++);
if(x>y)
return(a)
else
return(b);
}
main ( )
{int m = 60,n = 55,k;
k= delay(m,n);
}
第 3章 C51 函数被调用函数的定义在所有函数定义之前
③ 如果在所有函数定义之前,在文件的开头处,在函数的外部已经说明了函数的类型,则在主调用函数中不必对所调用的函数再作返回值类型说明。
第 3章 C51 函数说明例 3-11,试编写一段程序,调用函数时可以传递可以传递多个参数。
第 3章 C51 函数
int delay( )
main ( )
{ int k;
k= delay(10,20);
}
delay(x,y)
int a;b
{ for (a=0; a<x; a++)
for (b=0; b<y; b++);
if(x>y)
return(a)
else
return(b);
}
第 3章结束