第五章总结(下)

5.3函数的嵌套调用与递归调用

5.3.1函数的嵌套调用

1. C语言的函数定义都是相互平行,独立的。在定义一个函数体内不能在定义另一个函数。C语言不允许嵌套定义函数,但是允许嵌套调用函数即在调用一个函数的过程中,又可以调用另一个函数。

2.程序从main函数开始执行,任选X1和X2两个不同得点,判别F(X1)和F(X2)是否异号,如果不是异号,则在DO-WHILE循环的控制调用了F函数。随后,MAIN函数通过ROOT函数求得方程在(X1,X2)区间的根。在ROOT函数执行过程中,又调用了F和XPOINT函数。而XPOINT函数执行过程中,又调用了F函数。

5.3.2函数的递归调用

1.一个函数在其函数体内调用它自身成为递归调用,这种函数称为递归函数。

注:在递归函数中,由于存在着调用过程,程序控制将反复地进入它的函数体。为防止自引用过程无休止地继续下去,在函数体内必须设置某种条件。这种条件通常用IF语句来控制。当条件成立时终止自调用过程,并使程序控制逐步从函数中返回。

2.非数值问题的分析无法像数值那样能得到一个初值和递归函数式,但思路是相同的。

分析方法如下:

★简化问题:设要输出的正整数只有一位,则“反向输出”问题可简化为输出一位整数

★对于大于10的正整数,逻辑上可以分为两部分:各位上的数字和个为以前的全部数字。将个位以前的全部数字堪称一个整体,则为了反向输出这个大于10的正整数,可按以下步骤进行操作。1.输出个位上的数字;2.将个位除外的其他数字作为一个新的整数,重复1的操作其中步骤2只是对原问题在规模上进行了缩小-递归。

5.4局部变量和全部变量

5.4.1局部变量

在一个函数内部定义的变量为内部变量,它只在本函数范围内有效,也就是说只有在本函数才能使用它们,在此函数以外是不能使用这些变量的,这成为局部变量。

关于局部变量的定义和作用域有下列几点说明:

1.函数定义的变量只能在主函数作用,不能在其他函数中作用,同时,主函数中不能使用其他函数中定义的变量。因为主函数也是一个函数,他与其他函数是平行关系。

2.形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

3.同一作用域内的标识符(变量,函数名等)不能重复,不同作用域的标识符可以重名,它们不代表完全不同的含义。

4.在复合语句中可以定义变量,其作用域只在复合语句范围内。

☆:在复合语句的外部和内部都定义了一个名为M的同名变量。它们是分别存放在各自的内存空间的,其作用域不同。复合语句外边定义的变量M。其作用域是除复合语句外的整个函数;复合语句内定义的变量M。其作用域是复合语句内部。

5.4.2全局变量

在一个函数内定义的变量,而在函数之外定义的变量成为外部变量。外部变量使全局变量。全局变量可以为本文件中其他函数所共用。

关于全局变量的用法及作用域决定,有以下几点说明:

1.一个函数中可以使用形参,局部变量和全部变量

  函数中使用全部变量的好处是增加主调函数和被调函数之间的联系渠道。如若主调函数与被调函数都在谋全局变量的作用域范围之内,那么主调函数和被调函数都可以使用这个局部变量。被调函数中若对全局变量进行了修改,主函数可以使用这个修改值。由于一般的函数只能带回一个返回值,那么可借助全局变量带回各个返回值。

2.全局变量与全局变量不能重名,但全局变量可与局部变量重名,全局变量与局部变量(包括形参)重名时,在局部变量的作用域内,全局变量失去意义,局部变量起作用。

  全局变量的设置增加了函数之间的数据联系。利用他可以在函数之间传递多个数值。但是,要注意限制使用全局变量。因为全局变量在程序的全部过程中占用存储单元,这会浪费空间,另外,它还会降低函数的通用性。因为函数在执行时要依赖其所需的全局变量。而且,全局变量使用过多,会降低程序的可读性,原因是各个函数都有可能改变全局变量的值,程序易出错。

5.4.3存储变量的存储类别

局部变量的存储类别共有3种:自动的(AUTO),静态的(STATIC)和寄存器的(REGISTER).

自动变量

1.自动变量最为常用。其中AUTO可省略不写,前面介绍的函数定义的变量都没有指明存储类别,因此其存储类别隐含为AUTO

2.静态局部变量

若希望函数中局部变量的值在函数调用结束保留原值,就应使用静态局部变量,因为函数调用结束后,静态局部变量所占用的存储单元不被释放,当下一次调用该函数时,还保留上一次调用的原值不变。

对静态局部变量的说明如下:

△静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。儿子东边亮(即动态局部变量)属动态存储类别,占动态存储空间,函数调用结束后立即释放。

△静态局部变量在编译时赋初值,且值赋初值一次,而对自动变量赋初值是在函数调用时进行的。每调用一次函数重新给一初值,相当于执行一次赋值语句。

△如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时会自动赋初值0(对数值型变量)或空字符(对字符变量)而对自动变量来说,如果不赋初值则他的值是哟个不确定的值。

3.寄存器变量

寄存器变量存放在CPU的寄存器中,除此之外,它的性质与自动变量基本相同。由于CPU存储寄存器的速度比存取内存的速度快。使用寄存器变量可以加快程序的运行速度,所以,它可用于使用频率较高的变量,如循环变量。但是,由于计算机系统中的寄存器数目有限,所以不能在程序中定义过多的寄存器变量。

 

问题:自动变量的生存期为函数的被调函数期?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值