算術運算、型態轉換


在C++中提供與算術相關的 加(+)、減(-)、乘(*)、除(/)的運算子,另外還有一個也很常用的餘除運算子(%)或稱模數(Modulus)運算子,這類以數學運算為主的 運算子,稱之為「算術運算子」(Arithmetic operator)。

這類運算子的使用基本上由左而右進行運算,遇到加減乘除的順序問題時,也是先乘除後加減,必要時加上括號表示運算的先後順序,例如這個程式碼會在主控台顯 示7:
cout << (1 + 2 * 3);

編譯器在讀取程式碼時,是由左往右讀取的,而初學者往往會犯一個錯誤,例如(1+2+3) / 4,由於我們習慣將分子寫在上面,而分母寫在下面的方式,使得初學者往往將之寫成了:
cout << 1+2+3 / 4;

這個程式事實上會是這樣運算的:1+2+(3/4);為了避免這樣的錯誤,在必要的時候為運算式加上括號才是最保險的,例如:
cout << (1+2+3) / 4;

%運算子是餘除運算子 它計算除法後的餘數,一個例子是若您要產生指定位數的亂數,就可以使用%運算子,假設亂數產生函式為rand(),它可以產生正整數亂數,但您並不知道它 的最大範圍是多少,您可以這樣產生0到99的亂數:
cout << rand() % 100;

您也可以利用%來作循環計數之用,例如由0計數至9不斷循環:
couter = (counter + 1) % 10;

算術運算子使用不難,但要注意型態轉換的問題,請您先看看這段程式會印出什麼結果?
int number = 10;
cout << number / 3;

答案不是3.3333,而是3,小數點之後的部份被自動消去了,這是因為您的number是整數,而除數3也是整數,運算出來的程式被自動轉換為整數了, 那下面這個程式呢?
double number = 10.0;
cout << number / 3;

這個程式的結果會顯示3.3333,這是C++的隱式型態轉換(Implicit type conversion),在一個型態混雜的算式中,長度較長的資料型態會成為目標型態,較小的型態會自動提升為目標型態,因而在上例中3會被提升為3.0 再進行運算,結果就可以顯示無誤,這樣的轉換又稱算術轉換(Arithmetic conversion)。

在一個指定的動作中,左邊的數值會成為目標型態,當右邊的數值型態比左邊的數值型態長度小時,右邊的數值會自動提升為目標型態,例如:
int num = 10;
double number = num;

在上例中,number的值最後會是10.0,在指定的動作時,如果右邊的數值型態比左邊的數值型態型態長度大時,超出可儲存範圍的部份會被自動消去,例 如將浮點數指定給整數變數,則小數的部份會被自動消去,例子如下,程式會顯示3而不是3.14:
int num = 0;
double number = 3.14;
num = number;
cout << num;

由於失去的精度,在編譯時編譯器會提出警訊:
[Warning] converting to `int' from `double'

如果確定這個動作是您想要的,那麼您可以使用顯式型態轉換(Explicit type conversion)或稱之為強制轉型(Cast),例如:
int num = 0;
double number = 3.14;
num = static_cast<int>(number);

在兩個整數型態相除時,您也可以進行型態轉換,將其中一個型態轉換至double型態再進行運算,例如:
int number = 10;
cout << static_cast<double>(number) / 3;

上例中結果會顯示3.3333。

static_cast是Standard C++新增加的轉型語法,在這之前顯式型態轉換可以使用以下的舊語法:
int number = 10;
cout << (double) number/ 3;

基於向後相容,Standard C++仍支援這種舊語法,但鼓勵您使用新風格的語法,在新風格語法中還增加有const_cast、reinterpret_cast 與dynamic_cast,適用於不同的轉型場合,這在之後還會再介紹。