The C++ Programming Language(二)
第4章
一 布尔量
按照定义,true具有值1,而false具有值0。与此相对应,整数可以隐式地转换到bool值:非0的整数转换为true,而0转换为false,例如:
bool b = 7;//true
int i = true;//1
在算术和逻辑表达式里,bool都将被转为int,在这种转换之后得到的值上进行各种算术和逻辑运算。如果结果又被转回bool,那么0将转为false,
所有非0 值都转为true。
void g()
{
bool a = true;
bool b = true;
bool x = a + b;
bool y = a | b;
}
二 字符
1 一个char是有符号还是无符号的?由8个二进制位表示的256个值可以解释为整数值0~255,或者解释为-128~127。不幸的是,关于普通char如何选择的问题是由具体实现决定的。C++提供了另外两个类型,他们都确切的回答了这个问题:signed char保存的值是-128~127;而unsigned char保存的值是0~255。
在VS2005编译下面代码:
char c = 255;
int i = c;
std::cout << i << std::endl;
结果为 -1,所以VS2005会把char看成是有符号的字符
2 请注意,字符类型都是整型,可以对他们使用算术和逻辑运算符。
3 字符文字量的类型是char
三 整数类型
1 采用unsigled而不用int以便多获得一个位去表示整数,这不是什么好注意,通过将变量声明为unsigned而保证某些值为正的企图常常会被隐含的类型转换规则破坏。
2 与char不同的是, 普通int总是有符号的。
3 整数文字量有四种表现形式:十进制,八进制,十六进制,字符文字量
四 浮点类型
1 浮点数有三种类型:float,double, long double。他们的确切意义由实现确定
2 按照默认规定,浮点文字量的类型是double;如果需要写类型为float的浮点文字量,可以通过后缀家f或者F定义它们;如果需要类型为long double的浮点文字量,可以通过l或者L定义它们,如 3.14L 2.9-3L
五 大小
1 C++对象的大小是用char的大小的整数倍表示的,所以,按照定义char的大小为1,下面是基本类型的大小能够保证的性质:
1 = sizeof(char)<= sizeof(short) <= sizeof(int) <= sizeof(long)
1<=sizeof(bool)<=sizeof(long)
sizeof(char)<=sizeof(wchar_t)<=sizeof(long)
sizeof(float)<=sizeof(double)<=sizeof(long double)
sizeof(N)=sizeof(signed N)=sizeof(unsigned N) //其中N可能是char,short,int,long
2 此外,这里还保证char至少有8位,short至少有16位,而long至少有32位,一个char能够保持机器的字符集中的一个字符
3 机器字长:计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度,目前流行的是32位和64位
六 void
void被用于刻画一个函数并不返回值,它还被用做指向不明类型的对象的指针的基础类型
七 枚举
1 一个枚举是一个类型,一旦定义,枚举的使用就很像一个整数类型,枚举符所赋的值从0开始
2 如果某个枚举中所有的枚举符的值均为非负,该枚举的表示范围就是0~2K-1,其中的2K是能使所有枚举符位于此范围的最小2的冕;如果存在负的枚举值,该枚举的取值范围就是-2K~2K-1。例如:
enum{dark,light} //0~1
enum{a = 3, b= 9}//0~15
enum e3{min = -10, max = 1000000}//-1048576~1048575
3 一个整数可以显示转换到一个枚举,除非这种转换的结果位于该枚举的范围之内,否则就是无定义的。例如:
enum flag{x = 1, y = 2, z = 4, w = 8} // 0~15
flag f1 = 5;//类型错,5不是flag类型
flag f2 = flag(5);//可以
flag f3 = flag(99);//无定义
4 一个枚举的sizeof就是某个能够容纳其范围的整型的sizeof,而且不会大于sizeof(int),除非有某个枚举符的值不能用ing,也不能用uint表示。例如,在sizeof(int)= 4的机器上,sizeof(enum)可以是1,也可以是4,但不会是8
八 声明
1 一个名字能够在C++里面使用之前必须首先声明。
2
char ch;
int count = 1;
extern int err;
struct data{int d;};
double sqrt(double);
typedef complex<short> Point;
struct User;
上面大部分即是声明,也是定义,除了
extern int err;
double sqrt(double);
struct User;
3 在C++里面,每个命名实体必须有恰好一个定义,但可以有多个声明,一个实体的所有声明必须在所有引用的类型上完全一致。
4 有些定义还为实体确定了一个值,任何描叙了初始值的声明都是定义。
九 作用域
1 一个声明将一个名字引进一个作用域
2 在函数里面声明的名字,其作用域从它声明的那一点开始,直到这个声明所在的块结束位置
3 一个名字称为全局的,如果他在所有函数,类,名字空间之外定义的。全局名字的作用域从声明的那一点开始,一直延伸到这个声明所在文件的结束。
4 一个块里声明的名字可以遮蔽在其外围的块里面声明的名字或者全局的名字。
5 被遮蔽的全局名字可以通过作用域解析符::去引用,例如
void f()
{
int x = 1;
::x = 2;
x =2;
}
不过没有办法去使用被遮蔽的局部名字
6 函数参数被当作在函数最外层的块中声明的名字,所以
{
int x;//错误
}