能盡物之性,則可以贊天地之化育。 可以贊天地之化育,則可以與天地矣。 《中庸﹒第二十一章》 3 基本資料型態 能盡物之性,則可以贊天地之化育。 可以贊天地之化育,則可以與天地矣。 《中庸﹒第二十一章》
基本資料型態 3.1 整數和浮點數 3.2 變數和常數 3.3 算術運算 3.4 標準數學函數的運算 3.5 邏輯值及其運算 3.1 整數和浮點數 3.2 變數和常數 3.3 算術運算 3.4 標準數學函數的運算 3.5 邏輯值及其運算 3.6 字元與字串 3.7 位元處理運算
C++ 的資料型態
3.1 整數 整數 (integer values) 是所有不具小數點的數值。例如:
long int、8進位整數、16進位整數和 unsigned int (不加正負號的整數) 48U // unsigned int 75UL // unsigned long 372L // long 75l // long (不建議使用,因為l和 1不易區分) 012 // 128 = 10 0x12 // 1216 = 18
程式 Int.cpp // Int.cpp #include <iostream> using namespace std; int main() { cout << " 48U : " << 48U << endl; cout << " 75UL : " << 75UL << endl; cout << " 372L : " << 372L << endl; cout << " 75l : " << 75l << endl; cout << " 012 : " << 012 << endl; cout << " 0x12 : " << 0x12 << endl; return 0; }
程式 Int.cpp 執行結果 48U : 48 75UL : 75 372L : 372 75l : 75 012 : 10 012 : 10 0x12 : 18
浮點數(floating point numbers) 帶有小數點的數值。 浮點數的例子如下: 36.0 -7.382 +3.92L 0.00 +4.0 3.7f 3.7F
浮點數的指數表示法 (exponential notation) e為exponent的縮寫,可以寫為E或e。
float 和 long double 例如: 4.7 // double 48.0F // float 48.0f // float 3.75L // long double 4.26e12 // double 4.26e+12L // long double (+號可以省略) 4.26E-12 // double
程式 Float.cpp // Float.cpp #include <iostream> using namespace std; // ----- 主程式 -------------------------- int main() { cout << " 4.7 : " << 4.7 << endl; cout << " 48.0F : " << 48.0F << endl; cout << " 48.0f : " << 48.0f << endl; cout << " 3.75L : " << 3.75L << endl; cout << " 4.26e12 : " << 4.26e12 << endl; cout << " 4.26e+12L : " << 4.26e+12L << endl; cout << " 4.26E-12 : " << 4.26E-12 << endl; }
程式 Float.cpp 執行結果 4.7 : 4.7 48.0F : 48 48.0f : 48 3.75L : 3.75 4.7 : 4.7 48.0F : 48 48.0f : 48 3.75L : 3.75 4.26e12 : 4.26e+12 4.26e+12L : 4.26e+12 4.26E-12 : 4.26e-12
基本數值資料型態 的實際適用範圍及有效位數
3.2 變數和常數 變數 (variables) 常數 (constants) 所有的變數和常數都需要經由宣告 (declaration) 才能取用。
變數的宣告 賦予它一個名稱,並指定其所屬的資料形態。 例如: Int Age; float Height; 上面這兩個敘述同時也完成了Age和Height兩個變數的定義 (definition)。
變數的定義 在記憶體內確實配置足夠容納變數的記憶空間。 對於變數和常數而言,宣告通常也附帶完成了定義。
宣告敘述與記憶體空間的對應關係
short 和 long 除了關鍵字int用來指定整數的資料型態外,short和long分別用來代表「短的整數資料」和「長的整數資料」。例如: long int Ia; long Ib; short int Ic; short Id;
float 和 double 單精確度的浮點數和雙精確度的浮點數分別以 float 和 double 這兩個關鍵字宣告。例如: float Fa; // Fa 為單精確度的浮點數 double Db; // Db 為雙精確度的浮點數
程式 Average.cpp a, b, c 的平均值是: 5.76667 執行結果 // Average.cpp #include <iostream> using namespace std; // -------主程式-------------------- int main() { int Number = 3; float a, b; float c = 5.6; float Average; a = 7.8; b=3.9; Average = (a + b + c) / Number; cout << "a, b, c 的平均值是: " << Average << endl; } 執行結果 a, b, c 的平均值是: 5.76667
多重宣告 (multiple declarations) float a, b; 相當於下列二式: float a; float b;
變數c的宣告和初始化 float c = 5.6;
常數(constant) 代號的用途 1.避免重複直接寫出數值,以減少輸入的錯誤。 2.可以只修改一處定義,就能同時改變程式中所有使用這個值的地方。
常數的例子 const double TaxRate = 0.17; const float Inch2Meter = 0.024; const int Max = 1024;
常數 一旦被宣告為常數,則不能再是lvalue (左值),其內容不能更改。 譬如: const int Max = 1024; 新值。
算術運算子(arithmetic operators) 共有7個:
表達式(expression) 將常數、變數或函數以各種運算子聯結起來的組合: x < 15.8 x = y + sin( z ) ( x + y ) * 0.8 – z
敘述句(statement) C++ 程式裡面最小的可執行單元。例如: x = a + b * sin( c ) ; ; b++; y = ( b > 10.0 ) ; x = c + 5.0 ;
敘述句的規範 (1/2) 1.以分號當結尾。 2.可以任意放置。例如: 與 x = a + b * ( c + 6.5 ) + x = a + b * ( c + 6.5 ) + c * 105.8 – 4.0;
敘述句的規範 (2/2) 3.各個數值或變數名稱與運算子 (operator) 之間的空隔可有可無。 例如 x=a+b; 與
指派敘述 (assignment statement) 有等號的敘述: Value = expression; 例如: x = a + b; 指派敘述的處理步驟 (1) 算出expression的值。 (2) 將此值放在Value裡面,成為它的內容。
運算元 (operand) 和運算子 (operator) 在x * y這個運算裡,x和y稱為運算元 (operand),「*」稱為運算子 (operator)。
一元運算子 (unary operator) 和二元運算子 (binary operator) 作用於兩個運算元之間的運算子稱為二元運算子,像 *, / 和 % 這類的運算子都是。 如果只作用於一個運算元上,則稱為一元運算子,例如負號。
運算符號「-」 「-」既是一元運算子也是二元運算子。例如 -x 用來計算x的負值。然而 x – y 卻是用來計算x和y的差值。 我們將它視為兩個不同的運算子。
算術運算的優先權和結合規則 與我們熟悉的「先乘除後加減」規則相吻合,也就是說: 6 + 4 * 8 % 3 * 6 - 5 與 6 + ((4 * 8) % 3) * 6 - 5 的計算順序是一樣的。
運算子的優先順序和結合關係 在同一個敘述內,當運算子的優先權相同時,則依照從左至右的順序處理。
整數的除法 在C++ 中,整數相除時,其餘數被直接捨棄。例如 1/2 得到 0 3/7 得到 0 15/2 得到 7
餘數運算子 (modulus operator) % 1%2 得到 1 3%7 得到 3 15%2 得到 1
累加運算子 (increment operator) 和累減運算子 (decrement operator) 表示式 累加或累減表示式 N = N + 1 N++ 或 ++N N = N - 1 N-- 或 --N M = M + 1 M++ 或 ++M M = M – 1 M-- 或 --M
當 ++ 或 -- 寫在操作元之前 (稱為字首,prefix)時 M = ++i; 相當於 i = i + 1; M = i;
當 ++ 或 -- 寫在操作元之後 (稱為字尾,postfix) 時 M = i++; 相當於: M = i; i = i + 1;
累加和累減運算 M = i++ * 5; 相當於 M = i*5; i++; 而 M = ++i * 5; 則相當於
指派運算子 (assignment operators) 敘述 具有相同計算結果的敘述(使用指派操作子) Num = Num + Inc; Num += Inc; x = x * TaxRage; x *= TaxRate; y = y / Ratio; y /= Ratio; M = M % N; M %= N;
rvalue 和 lvalue 1. rvalue和lvalue分別為right value (右值) 和left value (左值) 的縮寫。 變數的值或表達式的計算結果稱為rvalue,因為它可以置於指派操作子等號「=」的右側。rvalue本身不可以被指定數值。 2. 經由compiler規劃過的記憶位置所儲存的內容稱為lvalue,因為它通常放在指派操作子的左側。它可以被指定存入某個數值。 3. 指派敘述可以視為把rvalue置入lvalue的操作。 例如,下列兩個敘述: 5 = x ; ( b = 10.0 ) = a ; 都是錯誤的敘述。
資料型態間的轉換- 程式 Convert.cpp 執行結果 // Convert.cpp #include <iostream> using namespace std; // -------主程式-------------------- int main() { int a = 5; float x; x = a + 3.8; cout << "x 的值是: " << x << endl; } x 的值是: 8.8
隱性資料型態轉換 (implicit type conversions) 表示式 (expression) 計算結果的資料型態 a + 3.8f float a + 3.8 double
C++ 敘述的隱性資料型態轉換規則 1.如果混合不同的資料型態,則計算結果以最精確的資料型態為準。 2.當所有的運算元都具有相同的資料型態,計算結果不做型態轉換。 3.如果是指派運算 (assignment operation),則依lvalue的資料型態儲存。
C++ 的兩種顯式資料型態轉換語法 (資料型態) 變數名稱; 資料型態 (變數名稱); 例如 x = float (a) + 3.8f ; 或是 x = (float) a + 3.8f ;
sizeof () 運算子 可以用來顯示資料所使用的記憶空間有幾個位元組。 運算子sizeof() 括號內的引數可以是資料,也可以是資料型態。
程式 Size.cpp 檢查資料型態的長度以及隱式資料轉換的效果 #include <iostream> #include <conio> using namespace std; // ---------------- 主程式 ------------------------- int main() { int a = 5; cout << " Size of int is : " << sizeof(int) << " bytes" << endl; cout << " Size of short is : " << sizeof(short) cout << " Size of(3.8f + a)is : " << sizeof(3.8f + a) return 0; }
程式 Size.cpp 執行結果 Size of int is : 4 bytes Size of short is : 2 bytes Size of (3.8f + a) is : 4 bytes
3.4 標準數學函數的運算 要使用C++ 的數學函數前,我們需要先知道: 要呼叫的數學函數之名稱及其功能。 該函數的輸入及輸出資料型態。 如何將提供該函數的標頭檔 <cmath> 寫到程式裡。
程式 Power3.cpp 計算實數x的3次方 // Power3.cpp #include <cmath> #include <iostream> using namespace std; // ------------ 主程式 ---------------------- int main() { double x ; cout << "請輸入一個數值:\n "; cin >> x; cout << "它的3次方是: " << pow(x,3) << endl ; return 0; }
程式 Power3.cpp 的操作過程 請輸入一個數值: 4.8 它的3次方是: 110.592
引數 (arguments) 及函數的重載 (Overloading)
使用內建的數學函式時最常犯的錯誤 -- 絕對值的使用 使用內建的數學函式時最常犯的錯誤 -- 絕對值的使用 abs(x) 的結果是整數,而fabs(x) 才能獲得正確的浮點數。例如: double x = -253.0427; cout << abs(x); // 得到253 cout << fabs(x); // 得到253.0427
常用的數學函數
3.5 邏輯值及其運算 邏輯值又稱為布林資料 (Boolean data),只有true和false兩種值,分別代表「真」和「偽」。 在 C++ 中,任何不是 0 的值進行布林資料判斷的結果都視為true。
關係運算 (Relational Operations) 關係表達式 (relational expression): x < 3.8 的計算結果是1 ( x 小於 3.8 ) 或 0 ( x 大於或小於 3.8 )。
常用的關係運算子 (relational operators ) 意義 範例 < 小於 x < 3.8 > 大於 x > 10.0 <= 小於或等於 4.8 <= y >= 大於或等於 c >= b == 相等 x == y != 不相等 x != y
C++邏輯運算子 (logical operators) 邏輯意涵 範例 && AND ( a > b ) && ( c > d ) || OR ( x > 8.2 ) || ( y < 0.0 ) ! NOT ! ( x < 0.0 )
關係運算子和邏輯運算子的運算優先順序 運算子 結合規則 相關的等值運算 ! ++ -- -(負號) 從右至左 -!a -(!a) * / % ! ++ -- -(負號) 從右至左 -!a -(!a) * / % 從左至右 a*b/c ( a * b ) / c + - (減) a*b–c ( a * b ) – c < <= > >= a+b<c–d (a+ b) < ( c – d ) == != a<b == c–d (a< b) == (c – d) && a==b && c!=d (a == b )&&(c!=d ) || a && b||c (a && b) || c = += -= /= a = b||c a = (b || c)
關係運算和邏輯運算 (1) a * b – c < d (2) y = ( b > 10.0 ) ;
迪摩根定理 (De Morgan' s law) not (A and B) 等於 (not A) or (not B) not (A or B) (not A) and (not B) 以數學式表示 ( 和 分別為OR及AND的意思):
迪摩根定理的應用實例 !( x = a && y != b && z != c ) 可進一步改寫成:
bool 資料型態的應用實例:程式 BoolCheck.cpp #include <iostream> using namespace std; // ----- 主程式 -------------------------- int main() { bool b1, b2, b3, b4; b1= true; b2= false; b3= (3>1); b4= (3<1); cout << "b1 = " << b1 << endl; cout << "b2 = " << b2 << endl; cout << "b3 = " << b3 << endl; cout << "b4 = " << b4 << endl; cout << "Size of bool is : " << sizeof(bool) << " byte" << endl; cout << "Size of b1 is : " << sizeof(b1) return 0; }
程式 BoolCheck.cpp 執行結果 b1 = 1 b2 = 0 b3 = 1 b4 = 0 Size of bool is : 1 byte Size of b1 is : 1 byte
字元資料 1. 大寫與小寫英文字字母,A~Z,a~z。 2.十個阿拉伯數字0~9。 3.特別符號,如 + $ - @ ! 等等。 共128個符號。為了區別,所有的字元都以單引號前後包起來: 'a' 'A' '$' '+' '5'
字元 字元以ASCII碼儲存。每個字元佔一個位元組的大小。 ASCII是American Standard Code for Information Interchange的縮寫。 例如 a 存成 01100001 b 存成 01100010 Q = 8110 = 010100012。
字元的資料型態 char Ch = 'f' ; // 定義一個字元變數ch 其內容存了字母f cout << Ch << endl; // 輸出的是字母f而不是 'f'
中文字的儲存 BIG-5 Unicode (通用碼),亦採用16位元編碼,能夠涵括世界上各種不同的文字和符號系統。
逃離序列(escape sequences) 代表無法用單一符號表示,或是無法顯示的字元。 反斜線「\」則稱為逃離字元 (escape character)。如: '\b' '\t' '\\'
常用的逃離序列 Escape Sequence code 意義 \n 00001010 跳到下一行(newline) \t 00001001 跳到下一個定位點(tab) \b 00001000 退回一格(back) \f 00001100 跳到下一頁(form feed) \r 00001101 輸入(return) \\ 01011100 反斜線 \ \’ 00100111 單引號 ’ \” 00100010 雙引號 ” \0 00000000 字串結束符號
字串(string) 一序列用雙引號「"」包起來的字元。 在儲存的時候,所有的字串後面都會被自動加上字元 '\0',代表字串的結束。 例如: "c+b=" "中文" "The answer is: " "\nCorrect" "C:\\C++\\Examples\\File.cpp“ 在儲存的時候,所有的字串後面都會被自動加上字元 '\0',代表字串的結束。
儲存字串的 byte 數目 "c+b=" // 使用5 個位元組儲存 "中文" // 使用5 個位元組儲存 "中文" // 使用5 個位元組儲存 "Good! " // 使用6 個位元組儲存 "\nAnswer: " //使用9 個位元組儲存 (每個中文字都以兩個bytes儲存)
字串的儲存 "Good!" 儲存成: G o d ! \0 1 byte
字串的儲存 "中文" 儲存成: 中 文 \0 2 bytes 1 byte
驗證字串的儲存 // StringSize.cpp StringSize.cpp // ----- 主程式 -------------------------- int main() { cout << "字串 \"c+b=\" 的大小為 " << sizeof("c+b=") << "位元組" << endl; } 程式執行結果 : 字串 "c+b=" 的大小為 5 位元組
字元也可以進行運算 cout << 'a' + 0 << endl; //答案為97 cout << '0' + 0 << endl; //答案為48 cout << '\0' + 1 << endl; //答案為1 ('a' 的二進位儲存方式011000012所對應的值為97。) (字元 '0' 的值是48,而無法顯示的字元 '\0' 的值才是0。)
3.7 位元處理運算 位元處理運算子 位元處理運算子 意義 ~ 補數 (complement) << 左移 >> 右移 & 且(AND) ^ XOR | 或(OR)
位元處理運算子的真值表 位元處理運算子 意義 ~ 補數 (complement) << 左移 >> 右移 & 且(AND) ^ XOR | 或(OR)
位元處理運算子 AND 針對位元組的處理結果 表示式 計算結果 a 01000001 b 01100010 a & b 01000000
位元處理運算子 XOR 針對位元組的處理結果 表示式 計算結果 a 01000001 b 01100010 a ^ b 00100011
位元處理運算子 OR 針對位元組的處理結果 OR運算 表示式 計算結果 a 01000001 b 01100010 a | b 01100011
位元處理運算子 ~ (補數運算) 針對位元組的處理結果 表示式 計算結果 a 01000001 ~a 10111110
右移運算針對位元組的處理結果 右移運算 表示式 計算結果 a 10011010 a >> 2 00100110 如果有一個數值X,且N為整數,則 X >> N; 會將X的所有位元往右移N個位元位置,原來左端的位置則 補上0。 如果原來的數值是正整數,則右移一位元相當於除以2的運 算,左移一位元則相當於乘以2。
左移運算針對位元組的處理結果 左移運算 X << N; 會將X的所有位元往左移N個位元位置,原來右端的位置則補上0。 如果原來的數值是正整數,則左移一位元則相當於乘以2。 表示式 計算結果 a 10011010 a << 3 11010000
位元處理程式 BitOp.cpp // BitOp.cpp #include <iomanip> using namespace std; // ----- 主程式 ------------------------------------ int main() { short Ia = 0x5678, Ib = 0x12ff; char C1 = 'A' ; cout << hex; cout << "Ia & Ib = ox" << (Ia & Ib) << endl; cout << "C1 >> 2 = ox" << (C1>>2) << endl; return 0; } 程式BitOp.cpp執行結果 : Ia & Ib = ox1278 Ia ^ Ib = ox4487 C1 >> 2 = ox10