程式聲明將整型變數的類型告訴了C++編譯器,但編譯器如何知道常量類型呢? 除非有理由(如使用特殊尾碼,或者值太大無法存儲為int),不然都將存儲為int類型 尾碼是放在數字常量後面的字母 l、L表示long常量 u、U表示unsigned int ul(UL)或lu(LU)表示unsigned in ...
程式聲明將整型變數的類型告訴了C++編譯器,但編譯器如何知道常量類型呢?
除非有理由(如使用特殊尾碼,或者值太大無法存儲為int),不然都將存儲為int類型
尾碼是放在數字常量後面的字母
l、L表示long常量
u、U表示unsigned int
ul(UL)或lu(LU)表示unsigned int
ll、LL為long long
ull、Ull、uLL、ULL為unsigned long long
對不帶尾碼的十進位整數,使用能夠存儲該數的最小類型來表示:int、long或long long。
對不帶尾碼的八、十六進位數,採用能存儲該數的最小類型來表示:int、unsigned int、long、unsigned long、long long和unsigned long long
因為十六進位常用來表示地址,沒有符號,所以unsigned long 比long更合適
char專為存儲字元(字母和數字)
很多系統支持的字元不超過128個,則用一個位元組可表示所有符號
char比short更小
//chartype.cpp - - the char type #include<iostream> int main() { using namespace std; char ch; cout << "Enter a charcter:" << endl; cin >> ch; cin.get(); cout << "Hola!"; cout << "Thank you for the " << ch << " character." << endl; cin.get(); }
輸入時,cin將鍵盤輸入的M轉化為77,輸出時,cout將77轉換為所要顯示的字元M
//morechar.cpp - - the char type and int type contrasted #include<iostream> int main() { using namespace std; char ch = 'M'; int i = ch; cout << "The ASCII code for " << ch << " is " << i << endl; cout << "Add one to the character code:" << endl; ch = ch + 1; i = ch; cout << "The ASCII code for " << ch << " is " << i << endl; cout << "Displaying char ch using cout.put(ch):"; cout.put(ch); cout.put('!'); cout << endl << "done" << endl; cin.get(); }
‘M’表示M的字元編碼
char ch; cin>>ch;
如果輸入5按回車,則將5對應的字元編碼“53”存儲到ch中。
int n; cin>>n;
如果輸入5,則將數值5存儲到n中。
1.成員函數cout.put()
類定義瞭如何表示和控制字元,成員函數歸類所有,描述了操縱類數據的方法。
如類ostream有一個put()成員函數,用來輸出字元,只能通過類的特定對象來使用成員函數。
句點被稱為成員運算符,cout.put()表示通過類對象來使用函數put()
因為歷史上,C++的Release 2.0以前,cout將字元變數顯示為字元,將字元常量顯示為數字。(如‘M’、‘N’)
cout<<ch得到M
cout <<'M'得到77
不過現在已經可以正確的處理字元了
2.char字面值
一般最簡單的方法就是將字元用單引號括起,書寫字元
但有些字元不能通過鍵盤輸入到程式中,故採用特殊的方法——轉義序列
字元名稱 | ASCII符號 | C++代碼 | 十進位ASCII碼 | 十六進位ASCII碼 |
換行符 | NL(LF) | \n | 10 | 0xA |
水平製表符 | HT | \t | 9 | 0x9 |
垂直製表符 | VT |
\v |
11 | 0xB |
退格 | BS | \b | 8 | 0x8 |
回車 | CR | \r | 13 | 0xD |
振鈴 | BEL | \a | 7 | 0x7 |
反斜杠 | \ | \\ | 92 | 0x5C |
問號 | ? | \? | 63 | 0x3F |
單引號 | ' | \' | 39 | 0x27 |
雙引號 | " | \" | 34 | 0x22 |
將它們作為字元常量時,應用單引號括起,將它們放在字元串中,不要使用單引號
顯示數字時,使用endl比\n容易些,但顯示字元串時,\n更容易些,如
cout<<x<<endl;
cout<<"Dr.X.\n";
以下三個都是換行符:
cout<<endl;
cout<<'\n';
cout<<"n";
在使用數字轉義序列或符號轉義序列時應使用符號序列。數字與特定的編碼方式相關,符號適用於任何編碼方式,可讀性也強。
程式清單3.7 bondini.cpp
//bondini.cpp - - using escape sequences #include<iostream> int main() { using namespace std; cout << "\aOperation \"HyperHype\" is now activated!\n"; cout << "Enter your agent code:________\b\b\b\b\b\b\b\b"; long code; cin >> code; cin.get(); cout << "\aYou entered " << code << "...\n"; cout << "\aCode verified!Proceed with plan Z3!\n"; cin.get(); }
3.通用字元名
如:
int k\u00F6rper;
cout<<"Let them eat g\u00E2teau.\n"
Ö的ISO 10646碼點為00F6,而â的碼點為00E2.
上述變數名為kÖrper,輸出為Let them eat gâteau.
通用字元名的用法類似於轉義字元,以\u和\U打頭,\u後面是8個十六進位位,\U後面是16個十六進位位。
Unicode為大量字元和符號提供標準數值編碼,給每個字元指定一個編號——碼點,如U-222B。ASCII碼是它的子集。
4.signed char和unsigned char
與int不同的是,char在預設情況下既不是沒符號,也不是有符號,是開發人員最大限度的將這種類型和硬體屬性匹配起來。
5.wchar_t
程式需要處理的字元集可能無法用一個8位的位元組表示
1.如果大型字元集是實現的基本字元集,則可將char定義為一個16位或更長的位元組
2.一種實現可以同時支持一個小型基本字元集(char表示)和一個較大的擴展字元集(wchar_t表示)
wchar_t bob=L'P'; wcout<<L"tall"<<endl;
wcin和wcout用來處理wchar_t流,加上首碼L來指示寬字元常量和寬字元串。
新增了char16_t和char32_t
前者是16位,後者32位,都是無符號的
char16_t與/u00F6通用字元名匹配,char32_t與/U0000222B匹配
char16_t ch1=u'q'; char32_t ch2=U'\U0000222B';
6.bool類型
將非零值解釋為true,將零解釋為false
bool is_ready=true; int ans=true; //ans=1 int promise=false; //promise=0 bool start=-100; //start=true bool stop=0; //stop=false
7.const限定符
const int Months=12;
常量Months被初始化以後,其值就被固定了,編譯器將不允許再修改該常量的值
創建常量的通用格式 const type name=value; 應在聲明中對const進行初始化 const int toes; toes=10; 如果在聲明常量時沒有提供值,則該常量值將是不確定的,且無法修改。
8.浮點數
存儲浮點數由兩部分構成
一部分表示值,一部分表示對值進行放大和縮小
如數字34.1245和34124.5,可將第一個數表示為0.341245和100,第二個表示為0.341245和10000
浮點數由兩種寫法
一種就是小數點法,另一種是3.45E6,相當於3.45*10的6次方,如果是負數意味著除以10的乘方
浮點類型:
C++對有效位數的要求是:
32≤float≤double≤long double
且double≥48
一般float為32位,double為64位,
long double為80、96或128位
程式清單3.8 floatnum.cpp //floatnum.cpp - - floating-point types #include<iostream> int main() { using namespace std; cout.setf(ios_base::fixed, ios_base::floatfield); float tub = 10.0 / 3.0; double mint = 10.0 / 3.0; const float million = 1.0e6; cout << "tub = " << tub; cout << ", a million tubs = " << million*tub; cout << ",\nand ten million tubs = "; cout << 10 * million*tub<<endl; cout << "mint =" << mint << " and a million mints = "; cout << million*mint << endl; cin.get(); }
setf()調用迫使輸出使用定點表示法,以便更好的瞭解精度,防止程式把較大的值切換為E表示法,將程式顯示到小數點後6位。
通常cout會刪除結尾的零,用cout.setf()將覆蓋這種行為,由於cout列印6位小數,則tub和mint都是精確的,但乘了一百萬以後,就有了誤差,說明float有7位有效數字,而double至少13位是有效的
預設浮點常量都存儲為double類型
1.234f //f或F尾碼為float類型
2.45E20F
2.345324E28 //double
2.2L //l或L尾碼 long double類型
浮點數兩個優點是表示整數之間值,表示範圍大。缺點是運算慢,精度會降低。
程式清單3.9 fltadd.cpp //fltadd.cpp - - precision problems with float #include<iostream> int main() { using namespace std; float a = 2.34E+22f; float b = a + 1.0f; cout << "a=" << a << endl; cout << "b-a=" << b - a << endl; cin.get(); }
a=2.34e+022
b-a=0
因為float只能表示數字中前6或7位所以修改第23位的值不會有任何影響