明解C++教學手冊 柴田望洋 博士 著 書號:PG20269
第四章 資料型態和陣列 本章要學習的是整數型態和浮動小數點型態等內建資料型態、有效率地表示同型態之資料的陣列,以及表示整數值之集合體的列舉。
4-1 整數型態 整數型態 整數型態(integer type)是可表示有限範圍內的連續整數之型態。 4-1 整數型態 整數型態 整數型態(integer type)是可表示有限範圍內的連續整數之型態。 在宣告型態時加上unsigned或signed等型態修飾詞(type specifier),可以指定要使用無符號的整數型態還是有符號的整數型態。
整數型態還可依據其能夠表示之個數,分為char、short int、int、long int這四種,除了char型態以外,其他三個形態都各有無符號版和有符號版。 這些型態與bool型態及wchar_t型態合稱為泛整數型態(integral type)或整數型態(integer type)。
C++的處理器是以<climits>標頭來提供整數型態的各型態所能表現之數值範圍。
#define指令是進行「取代」之指示,像這樣的取代指令就是類似對象巨集(object-like macro),而INT_MAX這樣的名稱則是巨集名稱(macro name)。
使用類似對象巨集的優點為: 可以將值的管理集中在巨集定義的部份。 由於可以賦予常數值名稱,所以程式會比較容易解讀。
字元型態有以下三種: 單純字元型態 無符號的字元型態 有符號的字元型態
字元型態所能表現的範圍會因處理器而不同,這是因為各種處理器之字元型態在記憶體上所佔有的位元數不同。
電腦是透過字元碼來識別字元。
整數常值是以十進位數、八進位數以及十六進位數這三種基數來表示。
物件和sizeof運算子 變數的正式名稱為物件(object)。
sizeof運算子有以下這兩種形式: sizeof 運算式 izeof(型態)
size_t型態和typedef sizeof運算子所產生的size_t型態,並不是C++本身的內建型態(built-in type),必須引入<cstddef>標頭才能使用。 typedef宣告可以給予即存型態另一個名稱。
typeid運算子 typeid運算子可以取得型態的各種相關資訊。
bool型態 不是0的數值會被視為true,而0則會被視為false。
4-2 浮動小數點型態 浮動小數點型態 浮動小數點型態()可以表示具有小數點以下部份之實數,它可分為以下這三種: float 4-2 浮動小數點型態 浮動小數點型態 浮動小數點型態()可以表示具有小數點以下部份之實數,它可分為以下這三種: float double long double
浮動小數點常值可以使用附指數之數學表示法。 若是加上浮動小數點尾碼(floating suffix),就可以指定型態。
4-3 運算和型態 運算和型態
在兩邊運算元的型態不同的運算中,會進行隱式形態轉換(implicit type conversion)。
作為運算對象的運算元之型態不同時,型態較小的運算元會先轉換成較大的型態再進行計算。
顯式型態轉換 要用實數求取整數除以整數的商時,至少要有一邊的運算元是double型態,並且使用「/」運算子。
這種顯式型態轉換(explicit type conversion)就叫做轉型(cast),其中的( )則是轉型運算子。 顯式型態轉換的轉型寫法: (型態) 運算式 這種顯式型態轉換(explicit type conversion)就叫做轉型(cast),其中的( )則是轉型運算子。 顯式型態轉換的函數寫法: 型態 (運算式)
static運算子可以執行靜態轉型(static cast),它是適用於隱式型態轉換的「自然型態轉換」所使用的運算子。
可以使用轉型寫法、函數寫法和static cast的其中之一,來進行整數和浮動小數點數之間的型態轉換。
迴圈控制 下列程式的執行結果會視處理器而有所不同。
作為判斷迴圈之基準的變數,應該使用整數而非浮動小數點數。
4-4 陣列 陣列 陣列是由同型態之變數(元素)集合而成的。 陣列是透過賦予元素型態、變數名稱和元素數來宣告,而元素數必須是常數。
各元素的存取是藉由在[ ]中賦予整數型態之索引(subscript)來進行。 由於開頭元素的索引會是0,所以各元素從頭開始會依序是a[0]、a[1]、a[2]、a[3]、a[4]、a[5]。
可藉由陣列來實現相同型態的集合體。
陣列和for敘述 下面是使用陣列的程式。
下面是用for敘述改寫之後的程式。
使用陣列處理成績 使用陣列改寫List 4-17的程式如下:
加上const來宣告的物件,就可以作為無法變更值的常數運算式(const expression)來使用。
陣列的初始化 給予陣列的初始化子是用逗號(,)來區隔,並依序排在{ }之中。 若是不給予元素數來宣告陣列,就會依初始化子的數量來決定陣列的元素數。
陣列的元素數 陣列a的元素數是使用sizeof(a) / sizeof(a[0])來求取。
陣列型態的資訊 typeid運算子也可以調查陣列的型態。
將陣列逆向排列
陣列的複製 由於無法透過指定運算子來複製陣列,所以必須像下面的程式這樣子進行複製。
逐一走過陣列的元素就叫做走訪(traverse)。
多維陣列 也可以將「陣列」作為陣列的元素,這種陣列又稱為多維陣列(multidimensional array)。
初始化子 沒有給予初始化子的元素,將自動以0初始化。 多維陣列的初始化子沒有必要以{ }來作成巢狀結構。
4-5 列舉 列舉 表示可以表示值的「集合體」。 宣告表示狗、貓、猴的集合體之列舉(enumeration)。Animal是列舉名稱(enum-name),而{ }中的Dog、Cat、Monkey則是列舉元(enumerator)。 無法對列舉的變數使用插入運算子來讀入值,此時會暫且將值讀入int型態的變數type。 宣告animal型態的變數「selected」。
總結 表示有限範圍的整數之整數型態有char型態、int型態、bool型態、wchar_t型態。整數型態的特性是在<climits>標頭中作為類似對象巨集來定義。 表示實數的浮動小數點型態有float型態、double型態、long double型態。浮動小數點型態的特性是定義在<cfloat>標頭中。 char型態有單純char型態、unsigned char型態、signed char型態這三種。單純char型態是有符號形態還是無符號型態則視處理器而定。 程式中是以字元碼來辨識字元。 透過isprint之類的is…函數,就可以調查字元的種類。 int型態有short版、單純int版、long版這三種。而每一種還可分為有符號版和無符號版。
整數常值可以用十進位、八進位以及十六進位來表示。必要的時候,還必須在最後面加上整數尾碼U或L來指定型態。 迴圈的控制應該使用整數型態而不是浮動小數點型態。 bool型態是表示真和偽的型態。布林常值有true和false這兩個。 如果插入boolalpha操作子,就可以將bool型態的值以字元而非整數值來輸出。 物件就是用來表現值的記憶區域。 運算式和型態在記憶體上所佔有的大小,可以使用sizeof運算子來取得。 sizeof運算子所產生的size_t型態是在<cstddef>標頭內被typedef宣告。 typedef宣告可以給予原有的型態一個新的名稱。 型態的相關資訊可以透過typeid運算子來取得。
整數之間的計算結果會是整數,而浮動小數點數之間的計算結果則會是浮動小數點數。 浮動小數點型態和整數型態等不同型態之間的數值計算,會自動進行型態轉換。 要將運算式的值轉換成以其他型態來表現的值,只要進行轉型(型態轉換)即可。 轉型有轉型寫法、函數寫法、動態轉型、靜態轉型、強制轉型以及常數性轉型這六種。整數和浮動小數點數之間的型態轉換,可以用轉型寫法、函數寫法和靜態轉型的任何一種來進行。 集合同型態的物件,並在記憶體上排成一線就是陣列,陣列是以元素型態、名稱、元素數來作為特徵。 陣列的各個元素可以透過索引運算子[ ]來存取。索引是指示元素位置(位於開頭之後的第幾個元素)的值。
宣告陣列時一定要給予元素數(作為常數運算式),如果需要表示元素數的變數的話,可以將元素數作為常數物件來實現。另外,宣告過的陣列a的元素數,可以使用sizeof(a) / sizeof(a[0])來求取。 不可以使用指定運算子「=」來完全複製陣列的所有元素。 對陣列的元素進行有規律的操作時,很適合使用for敘述。 以陣列作為元素的陣列就是多維陣列,透過視維數之不同來多重地使用索引運算子[ ],就可以存取各個元素。 列舉可以表示某個範圍的整數之集合體,各個列舉元會是表示值的名稱。 對整數常數給予名稱時,應該使用常數物件或列舉,而不是類似對象巨集。