一、bool 类型
逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节。
声明方式:bool result; result=true;
可以当作整数用(true一般为1,false为0)
把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false,注意会发生截断。
二、const 限定符
(1)、用const给字面常量起个名字(标识符),这个标识符就称为标识符常量;因为标识符常量的声明和使用形式很像变量,所以也称常变量。
定义的一般形式:
const 数据类型 常量名=常量值; 数据类型 const 常量名=常量值;
例如: const float PI=3.14159f;
注意事项:
常变量在定义时必须初始化;
常变量初始化之后,不允许再被赋值;
正如我在这里所说,其实加了关键字const只是提示编译器这个变量是常量,如果我们在接下来的操作中试图更改它,编译器会报错,而并不是真正的常量,事实上某些情形下通过指针也是可以更改的(编译器报警告),什么情况下完全不能修改呢,当A是加const限定且初始化的全局变量,此时A位于.rodata段(linux 下)。此外const 用于修饰指针时可以参考这里。
(2)、const 与 #define
const定义的常量与#define定义的符号常量的区别:
const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换
const定义的常量在编译/运行时确定初值,而#define定义的常量是在预编译时进行替换,不分配内存。
作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消
#define定义的常量,容易产生副作用:
//Effective C++ 3rd的一个例子。
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
int a = 5;
int b = 0;
CALL_WITH_MAX(++a, b); //a被累加二次
CALL_WITH_MAX(++a, b+10); //a被累加一次
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”
此外,定义常量还可以用enum,在c++ 中尽量用const、enum替换#define定义常量,用inline 替换带参数的宏定义;但 #define 在底层编程中是必不可少的,下面举个例子: