注:本文是对苏小红版c语言程序设计第七章的笔记
- 函数是c语言模块化程序设计的最小单位
- 内部变量:函数体内部定义的变量只能在函数体内访问,称为内部变量。
形式参数也是内部变量 - 若函数没有返回值,则用void定义返回值的类型
若函数不需要入口参数,则须用void代替函数头部中形参表中的内容。 - 函数的返回值只有一个,即便有多个return语句
(无返回值的函数中若程序不是运行到最后一条语句再返回,可写成return;
) - main函数中return返回的0等价于调用exit()提供的参数
- 函数原型声明:
long Fact(int n);
在函数原型的形参列表中,形参变量名可以省略,只给出形参类型即可(也可以省略形参类型) - 对函数
unsigned long Fact(unsigned int n);
:
若传入一个负数(如-1), 则会出错:因为会把-1的符号位(1)解释成了数据位,从而将有符号整型数-1解释成了无符号的4字节整数 - 一个递归调用函数必须包含如下两部分
- 一般情况
- 基线情况(能够用来结束递归调用过程的条件)
- 迭代不断修改循环控制变量,直到它是循环条件为假为止;递归则不断产生最初问题的简化副本,知道简化为递归的基线情况。
- 每个迭代程序原则上都可以转换成等价的递归程序,反之不然。为了提高程序的执行效率,应尽量用迭代形式代替递归形式(递归程序的时空效率偏低)。
- 全局变量会在不指定初值的情况下自动初始化为0.
- 没有制定变量的存储类型,那么变量的存储类型就缺省为auto(自动变量(动态局部变量)),自动变量在定义时不会自动初始化。
- 函数的参数传递是“单向的值传递”,只能将实参的值传递给形参,而不能返向将形参的值传递给实参,形参值的改变也不会影响实参。
- 若不希望形参值在函数内被修改,那么只要将关键字const放在形参前面,将形参声明为常量即可。
- 静态变量:与程序共存亡。值可改变,有“记忆功能”
- 静态局部变量只能在定义它的函数内部访问,静态全局变量可以在定义它的文件内的任何地方访问。
- 外部变量:用extern进行声明(而不是定义,编译器不对其分配内存)
是外部变量。若希望在定义点之前或者其它文件中使用它,则需要声明。
没有显式初始化的外部变量有编译程序自动初始化为0.没有显式初始化的外部变量有编译程序自动初始化为0. - 模块分解的基本原则:
- 高聚合(模块功能相对独立和单一)
- 低耦合(模块之间的联系越松散越好(模块对外的接口越简单越好))
- 自顶向下,逐步求精
- 断言:用于调试程序,不能作为程序的功能
- 检查程序中的各种假设的正确性,例如一个计算结果是否在合理的范围内
- 证实或测试某种不可能发生的状况确实不会发生,例如一些理论上永远不会执行到的分支(如switch的default后)确实不会被执行
e.g.:
#include <assert.h>
...
assert(number >= 0 && number <= 100)
...