E__programfiles_Apache+Software+Foundation_Tomcat+6.0_webapps_c_resources_wanglu_第6章函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

函数的返回 使流程返回主调函数,宣告函数的一次执行终结,在调用 期间所分配的变量单元被撤销 送函数值到调用表达式中
6.2 函数定义的一般形式
类型名 { 函数名( 类型名 形式参数 1,类型名 形式参数 2,...... )
声明部分
执行部分 }
通常把函数返回值的类型称为函 数的类型,即函数定义时所指出 的类型
函数值的类型 int max ( float x , float y ) char letter ( char c1 , char c2 ) double min ( int x , int y ) 如果函数值的类型和 return 语句中表达式的值不一致,则以 函数类型为准。对数值型数据,可以自动进行类型转换,即函数 类型决定返回值的类型
如果已在所有函数定义之前,在函数的外部已做了函数声明, 则在各个主调函数中不必对所调用的函数再作声明 char letter ( char , char ) ; float f ( float , float ) ; int i ( float , float ) ; main ( ) { ...... } char letter ( char c1 , char c2 ) { ...... } float f ( float x , float y ) { ...... } int i ( float j , float k ) { ...... }
对被调用的函数作声明
void main ( ) { float add ( float x , float y ) ; float a , b , c ; scanf ("%f , %f ", &a , &b ) ; c = add ( a , b ) ; printf ( "sum is %f \n", c ) ; } 运行结果: float add ( float x , float y ) { 3.5,6.5 float z ; sum is 10.000000 z=x+y; return ( z ) ; }
这就是函数的返回值
max ( 2 , 3 ) max ( 5 , 2 )
函数的返回值是通过函数中的 return 语句获得的 return 语句的一般形式为: return return 表达式 ; ( 表达式 ) ;
表达式的值的类型应当与函数定义中的返回值的类型一致。 若不一致,会发生数据类型转换,将表达式的值转换为所定 义的函数返回值的数据类型 如果需要从被调用函数带回一个函数值,则被调用函数中 必须包含 return 语句 int absolute ( int d ) { 函数中也可以有不止一 个 return 语句 } if ( d < 0 ) return -d ; return d ;
从用户使用的角度,函数有两种: 标准函数,即库函数 用户自己定义的函数 从函数的形式,函数分两类: 无参函数 有参函数
6.2 函数定义的一般形式
类型名 { 函数名( 类型名 形式参数 1,类型名 形式参数 2,...... )
声明部分
执行部分 } 应符合 C 语言对标识符的规定
c = 2 * max ( a , b ) ;
函数参数
m = max ( a , max ( b , c ) ) ; printf ( "%d", max ( a , b ) ) ;
6.4.3 对被调用函数的声明和函数原型
一个函数中调用另一个函数需要具备的条件: 被调用的函数必须是已经存在的函数 如果使用库函数,一般还应该在本文件开头用#include 命令 将调用有关库函数时所需要用到的信息“包含”到本文件中 如果使用用户自己定义的函数,而且该函数与调用它的函数 在同一个文件中,一般还应该在主调函数中对被调用的函数作 声明
形参与实参的类型应相同或赋值兼容
C 语言中实参与形参是按传值方式结合的,称为传值调用。 参数的传递为单向传递。将实参的值传递给形参后,如果在被 调用函数中对形参进行操作,改变了形参的值,则不会反过来 影响实参的值
a
2
b
3
a
2
b
3
x
2
y
3
x
10
y
15
6.3.2 函数的返回值
通常希望通过函数调用使主调函数能得到一个确定的值,
j=i;
k = ++ i ;
p=f( j, k );
若本意是按自右而左的顺序求实参的值,可改写为:
j = ++ i ; p = f ( j , j ) ;
6.4.2 函数调用的方式
按照函数在程序中出现的位置来分,可以有以下三种函数 调用方式: 函数语句 printstar ( ) ; 函数表达式
float
add ( float x , float y ) ;
float
add ( float , float ) ;
以前的 C 版本的函数声明方式不是采用函数原型,而只声明函 数名和函数类型 float add ( ); 实际上,如果在函数调用之前,没有对函数作声明,则编译系 统会把第一次遇到的该函数形式(函数定义或函数调用)作为函 数的声明,并将函数类型默认为 int 型 如果被调用函数的定义出现在主调函数之前,可以不必加以声 明
运行结果: 7,8 Max is 8
函数中的形参在未进行函数调用时,并不占有内存单元。只 有发生函数调用时,才给形参分配内存单元并将实参内存单元 的值传递给形参单元。函数调用结束后,形参单元被释放
实参可以是常量、变量或表达式 max ( 3 ,a + b )
在被定义的函数中,必须指定形参的类型
②在函数体中形式参数是可以被引 用的,可输出、被赋以新值或参 与运算
6.2 函数定义的一般形式
类型名 { 函数名( 类型名 形式参数 1,类型名 形式参数 2,...... )
声明部分
执行部分 }
void
{ }
null ( )
6.2 函数定义的一般形式
类型名 { 声明部分 执行部分 } 函数名( 类型名 形式参数 1,类型名 形式参数 2,...... )
6.2 函数定义的一般形式
类型名 { 函数名( 类型名 形式参数 1,类型名 形式参数 2,...... )
声Leabharlann Baidu部分
执行部分 } 程序进行编译时,并不为形式参 数分配存储空间。只有在被调用 时,形式参数才临时占有存储空 间,从调用函数中获得值,这称 为“虚实结合”,形参从相应的 实参得到值 有两个作用:①表示将从主调函数 中接收哪些类型的信息
返回值类型与函数类型不同
void main ( ) { float a , b ; int c ; scanf ( "%f , %f", &a , &b ) ; c = max ( a , b ) ; printf ("Max is %d\n", c ) ; } 运行结果: int max ( float x , float y ) { 1.5,2.5 float z ; Max is 2 z=x>y? x : y ; return ( z ) ; }
一个源程序文件由一个或多个函数组成。一个源程序文件是 一个编译单位,即以源程序为单位进行编译,而不是以函数为 单位进行编译 一个 C 程序由一个或多个源程序文件组成 C 程序的执行从 main 函数开始,调用其他函数后流程返回 到 main 函数,在 main 函数中结束整个程序的运行。main 函 数是系统调用的 所有函数都是平行的,即在定义函数时是互相独立的。一个 函数并不从属于另一个函数,即函数不能嵌套定义。函数间可 以互相调用,但不能调用 main 函数
6.4 函数的调用
函数调用的一般形式 函数调用的方式 对被调用函数的声明和函数原型
6.4.1 函数调用的一般形式
函数名 ( 实参列表 );
实参可以是常量、变量或其他表达式。如果实参表列包含多 个实参,则各参数间用逗号隔开。实参与形参的个数应相等, 类型应一致。实参与形参按顺序对应,一一传递数据
为了明确表示“不带回值”,可以用“void”定义为“无类型” (或称“空类型”)
void printstar ( ) { ...... } void print_message ( ) { ...... }
a = printstar ( ) ; b = print_message ( ) ;
为了使程序减少出错,保证正确调用,凡不要求带回函数 值的函数,一般应定义为 void 类型
如果被调用的函数中没有 return 语句,函数并不是不带回值, 而只是不带回有用的值,带回的是一个不确定的值
{
int a, b, c ; a = printstar ( ) ; b = print_message ( ) ; c = printstar ( ) ; printf ( "%d, %d, %d \n", a , b , c ) ; }
如果按自左至右顺序求实参的值,则函数调用相当于 f (2 , 3), 程序运行应得结果为“-1” 若按自右至左的顺序求实参得值,则它相当于 f( 3 , 3 ),程序 运行结果为“0” 由于存在上述情况,使程序的通用性受到影响,因此应当避免 这种容易引起不同理解的情况 若本意是按自左而右的顺序求实参的值,可改写为:
6.4.3 对被调用函数的声明和函数原型
对函数的声明与函数定义中的第一行(即函数首部)基本上 是相同的,因此可简单的照写已定义的函数的首部,再加上一个 分号,就构成了函数的声明 函数原型的一般形式:
函数类型 函数类型 函数名( 参数类型 1,参数类型 2 ...... ); 函数名( 参数类型 1 参数名 1,参数类型 2 参数名 2 ...... ) ;
int 型和 char 型函数在定义时可以不定义类型,系统隐 含指定为 int 型
6.3 函数参数和函数的值
形式参数和实际参数
函数的返回值
6.3.1 形式参数和实际参数
* 在进行函数定义时,函数名后面括号内的参数称为形式参数,
简称形参
* 在主调函数中调用一个函数时,函数名后面括号内的参数称
变量的存储类别 内部函数和外部函数
6.1 概述
main
a
b
c
d
e
f
g
h
h
i
e
g
6.1 概述
编译系统提供的库函数 C 语言函数 用户根据需要定义的函数
自顶向下、逐步细化的程序设计方法
简单的函数调用
void main ( ) 运行结果: { printstar ( ) ; **************** print_message ( ) ; How do you do! printstar ( ) ; } **************** printstar ( ) { printf ( "****************\n" ) ; } print_message ( ) { printf ( " How do you do!\n" ) ; }
为实际参数,简称实参
在函数调用时,要进行形参和实参的结合,将实参的值传递 给形参(如果实参是表达式,则先计算出表达式的值,再将该值 传递给形参),然后再执行函数体
调用函数时的数据传递
void main ( ) { int a , b , c ; scanf ( "%d , %d", &a , &b ) ; c = max ( a , b ) ; printf ( "Max is %d\n", c ) ; } max ( int x , int y ) { int z ; z=x>y? x : y; return ( z ) ; }
如果实参表列包括多个实参,对实参求值的顺序并不是确定 的,有的系统按自左至右的顺序求实参的值,有的系统则按自 右至左的顺序
void main ( ) { int i = 2, p ; p = f ( i , ++ i ) ; printf ( "%d\n", p ) 在 Turbo C 系统上运行的结果如下: ; } 0 int f ( int a , int b ) { int c ; if ( a > b ) c=1; else if ( a = = b ) c=0; else c = -1 ; return ( c ) ; }
第六章
函数
模块化程序设计
基本思想是将一个大的程序按功能分割成一些模块,使每一 个模块都成为功能单一、结构清晰、接口简单、容易理解的小程 序
函数式的程序结构
不同存储类别的变量 编译预处理功能
主 要 内 容
概述 函数定义的一般形式 函数参数和函数的值 函数的调用 函数的嵌套调用 函数的递归调用 数组作为函数参数 局部变量和全局变量
相关文档
最新文档