1. 宏定义
格式:#define PI 3.14 (#define+ 常量名 + 值)
PS: 宏定义的常量名要大写,宏定义没有赋值符号(=),也不需要数据类型,结尾也没有分号。
宏:只是单纯文本替换。
宏定义时,常量名后面是一个整体,定义时需要注意。
例如:
错误:
#defineNUMBER 150+10 //这是错误的定义
正确:
#defineNUMBER (150+10)
Ps:宏在程序编译之前已经替换好了。
2. const 常量
a) 格式:const + 数据类型 + 常量名 = 值;
ps:所谓的常量,就是定义之后,不允许修改。
3.枚举
a) 枚举:一组命名的常量,并且范围数量有限。
b) 格式:enum 枚举名 {元素1,元素2…};
c) 枚举定义默认第一项低值为0,后面的项依次加1,可以在枚举中定义每一项的值,也可以定义某些项的值,未指定项,参照前一项的值加1.
4.函数
定义:完成某些特定功能的代码块,叫做函数。
优点:
a. 将程序模块化,
b. 实现代码复用
c. 使代码便于维护
格式:
返回值类型 函数名(形式参数){函数体}
返回值类型是void时,属于返回值函数。返回值类型是基本数据类型时,属于有返回值函数。
函数的调用:函数名(实际参数);
参数:
形式参数简称行参,用于函数声明以及定义时的参数列表中,用于传递数据到函数中。形参可以是变量、数组。行参只在函数内部有效。
实际参数简称实参,作为数据的载体,调用函数时用于传递数据给函数的形式参数。实参可以是变量、数组、表达式、常量、函数,都必须具有确定都值。
5. 变量的作用域
a) 定义:变量所能起作用的范围称为变量的作用域。
b) 局部变量:定义在函数内部的变量。可以在函数内使用,范围是定义该变量之后。还可以定在分支或者循环中。
c) 全局变量:定义在函数之外的变量。可以在任何位于该变量之后的函数中使用。
6. 变量的存储类型
a) 局部变量的三种存储类型:auto、static、register。
i. auto:自动型,默认就是自动型,每次使用时被创建,出了作用域被释放。
ii. static:静态变量,定义为静态变量之后,在程序运行期间一直保持,直到程序运行结束。
iii. register:寄存器型变量,类似于auto。
b) 全局变量的三种存储类型:无修饰符、static、extern。
i. 无修饰符:在程序运行时创建一次,程序结束时销毁,允许在同项目的其他文件中使用。
ii. static:程序运行时创建一次,程序结束时销毁,不允许在同项目的其他文件使用。
iii. extern:扩展其他文件中的全局变量到本文件进行使用,并不创建新到变量,而是使用已有到同名变量(函数默认为extern,可以用来扩展其他文件中到文件到本文件中使用)
7. 递归函数
定义:函数中自己调用自己本身的行为称为递归。
递归分为:
直接递归:直接调用自身称为直接递归。
间接递归:递归函数调用了其他函数,其他函数又调用了递归函数,称为间接递归。
递归和迭代(循环)的区别:
1. 递归从代码上看要别迭代简洁,但是系统消耗量要大于迭代。
2. 对于能够使用递归也能使用迭代解决大问题,首选迭代。
3. 注意实际使用递归时,递归大层次不应该太多,否则计算时间过长。
易错点:
1. 宏定义没有数据类型,没有赋值符号(=),结尾没有分号。
2. 枚举定义,没有赋值符号(=)
3. 函数递归时,忘记了函数的出口。
4. 使用已经存在的全局变量来声明局部变量。(虽然不会出错,但容易混淆),当全局变量和局部变量的变量名相同时,优先使用局部变量。
5. 宏定义函数
a) 格式:#define 宏函数名函数名
i. 例如:#define PTF(x) printf(x)
ii. #define FUN(x) ((x) *(x))
b) 注意:被替换的函数需要加括号,不然结果有可能不一致。
i. 例如:#define FUN(x) x*x FUN( 3 +2 ) = 3 +2 * 3 + 2=11 结果不对。
ii. #define FUN(x) ((x)*(x)) FUN(3+2)=((3+2)*(3+2))=25 结果是对的。
6.