局部变量:定义在某个大括号范围之间的变量
生命周期:
执行到定义时分配内存空间,大括号结束则内存被释放
作用域:
只能大括号范围内访问该变量
全局变量:定义在所有函数之外的变量
生命周期:
程序运行时,分配内存空间,整个程序结束时释放内存空间
作用域:
在程序任意的位置都可以访问
变量的修饰符:
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;} 在调用这个函数时会类似带参宏一样替换展开,既继承了带参宏的优势,又弥补了带参宏的缺陷 带参宏与带参函数的区别: 带参宏 带参函数 编译时替换 运行时执行 参数类型不限 参数类型需提前定义 程序长度 可变 程序长度不变 不占运行时间 只占编译时间 调用和返回时占用时间
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)