第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 被遮蔽的全域名字可以通過範圍解析符::去引用,例如
int x;
void f()
{
int x = 1;
::x = 2;
x =2;
}
不過沒有辦法去使用被遮蔽的局部名字
6 函數參數被當作在函數最外層的塊中聲明的名字,所以
void f(int x)
{
int x;//錯誤
}