一、断言assert
1. assert() 断言,断定这个表达式为真。
2. 要使用断言时,需引用头文件#include
例:int Div (int a,int b)
{
assert (b != 0);
return a\b;
}
若b=0,程序崩溃,但assert会告诉崩溃原因
二、const
1. const 常 只读,不能修改
2.作用:限定变量的写权限,变量只读
例:const int ca = 10;
b = ca;(正确)
ca = 100;(不可以)
const int cb;(不可以,没有初始化)
3.类型对于const而言是透明的
例:const int cb = 20; ó int const cb = 20;
4.const 的直接右边的内容不能作为左值
例:(1)const int *cp1 = &a; //指向常量的指针
*cp1 = 200; //error
cp1 = &b; //right
const 限定的是*cp1;
(2)int *const cp1 = &a; //常指针
*cp1 = 100; //right
cp1 = &b; //error
const 限定的是cp1;
(3)const int* const cp1 = &c; //指向常量的常指针
*cp1 = 100; //error
cp1 = &b; // error
const 限定的是int和*cp1
5.权限可以等价传递,或者缩小传递
例:int a=10;
const int ca = 100;
int *p1 = &ca;
p1 = &a; //error
因为p1没有权限,如果改变p1的值,那么p1解引用后就会改变ca的值,而ca是受权限的,这样做违背了const的用法,故而程序崩溃
const int *p2 = &a;
p2 = &ca; //正确
int * const p3 = &a;
p3 = &ca; //error p3受限制,如若改成*p3则合法
int *const p4 = &ca; //error
若合法,*p4赋值后便可将ca的值改变,违背const的用法
6.左值
放在赋值号‘=’左边的值叫左值,其他的为右值
三、变量的生命周期,作用域等总结
1. 代码段:存放代码
全局(静态)变量区:存放静态变量,全局变量
栈(堆栈)stack:存放局部变量(只用不回收)
堆heap:自己存放内存,自己释放内存(动态内存,自行管理)
2.全局变量:
(1)生命周期:从程序运行时开始创建,程序结束时才销毁
(2)作用域:从定义这个变量开始,到这个文件结束
(3)默认值:0
(4)存储区域:全局变量区
(5)链接属性:若无静态关键字static为外部(其他文件也能看到),有static为内部(只有自己能看见)
exterm int g_b; //g_b在其他文件有定义 exterm引用外部文件符号
static int g_c; //只能在内部文件使用
3.局部变量:定义在函数内部的变量,包括形参
(1)生命周期:进入函数时创建,函数退出时销毁
(2)作用域:只在本函数有效
(3)默认值:随机值 (若有static,默认值为0)
(4)链接属性:无
(5)存储区域:在栈中 (若有static,则在静态变量区中)
4.静态局部变量:
(1)生命周期:第一次进入函数时创建,程序结束时才销毁
(2)作用域:只在函数中有定义
(3)默认值:0
(4)链接属性:无
(5)存储区域:静态变量区