变量:
局部变量:定义在某个大括号范围之间的变量 生命周期: 执行到定义时分配内存空间,大括号结束则内存被释放
作用域: 只能大括号范围内访问该变量
全局变量:定义在所有函数之外的变量 生命周期: 程序运行时,分配内存空间,整个程序结束时释放内存空间
作用域: 在程序任意的位置都可以访问
变量的修饰符: auto:变量的默认修饰符,可以省略不写,表示变量的内存由系统自动分配与释放 const:常量修饰符,在程序运行的过程中其值不可更改 signed:变量的默认修饰符,有符号 unsigned:无符号,让数据类型的最高位不作为符号位出现 例如:char a; //保存的数值范围为:-128到127 unsigned char a; //保存的数值范围为:0-255 static:静态修饰 修饰局部变量: 1.静态局部变量初始化只会被执行一次 2.变量会随着程序的结束而结束 修饰全局变量: 该全局变量只能在本文件中访问到 修饰函数: 该函数只能在本文件中访问到
程序的异常处理: 编译时异常:只检查语法问题 warning:会产生可执行文件,但运行不一定正常 error:不会产生可执行文件 运行时异常:逻辑错误 段错误(core dump):非法内存访问 利用输出语句测试程序
常量:
1.定义的常量: 语法:const 数据类型 常量名 = 值;
2.常量的直接量:直接使用的量值 10 3.14 ‘a’ “hello”
整形数的直接量值为:int 浮点数的直接量值为:double 字符的直接量值为:char 字符串的直接量值为:char *(地址)
数据类型的转换: 隐式转换: 编译器自动进行一些基本的类型转换 强制类型转换(显示转换): (数据类型)数据:将某个数据强制转换为指定的数据类型 带单位的数据: 10L:long类型的数据10 3.14f:float类型的数据3.14
3.标识常量:宏 使用宏的好处(没有出栈入栈节省效率和空间) 语法:#define 宏名 宏值 在编译时,会使用宏值替换代码中所有使用宏名的地方
注意: 1、宏最外面要有(),每个参数也必须有() 2、宏一般不加; 因为,他不是一条语句 3、宏不能用于 ++ --的操作
带参宏:(有一定缺陷,如上面三点) 语法:#define 宏名(参数列表) 宏体 #define MAX(x,y) {(x)>(y)?(x):(y)}
拓展: 我们一般对一个函数进行修饰 inline
inline 修饰一个函数,告诉编译器,在函数的调用的位置直接展开,而不产生函数调用
不需要入栈出栈 但代码体积会增大
如:static inline int add(int a,int b){return a+b;}
在调用这个函数时会类似带参宏一样替换展开,既继承了带参宏的优势,又弥补了带参宏的缺陷
带参宏与带参函数的区别:
带参宏 带参函数
编译时替换 运行时执行
参数类型不限 参数类型需提前定义
程序长度 可变 程序长度不变
不占运行时间 只占编译时间 调用和返回时占用时间
|