算術運算、型態轉換


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

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

printf("%d\n", 1 + 2 * 3);

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

printf("%d\n", 1 + 2 + 3 / 4);

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

printf("%d\n", (1 + 2 + 3) / 4);

% 運算子是餘除運算子 它計算除法後的餘數,一個例子是,假設有個亂數產生函式為 rand(),可以產生正整數亂數,而你卻不知道它的最大範圍是多少,這時可以如下產生 0 到 99 的亂數:

printf("%d\n", rand() % 100);

也可以利用%來作循環計數之用,例如由 0 計數至 9 不斷循環:

counter = (counter + 1) % 10;

算術運算子使用不難,但要注意型態轉換的問題,請你先看看這段程式會印出什麼結果?

int number = 10; 
printf("%d\n", number / 3);

答案不是 3.333333,而是 3,小數點之後的部份被自動消去了,這是因為 numberint 整數,而除數 3 也是 int 整數,運算出來的程式被自動轉換為 int 整數了,而為了正確的顯示運算的整數結果,還要使用 %d 格式指定字, 那下面這個程式呢?

double number = 10.0;
printf("%f\n", number / 3);

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

除了注意隱式型態轉換的問題,運算結果輸出時,還必須搭配格式指定字,才可以正確的顯示最後運算的結果。

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

int num = 10;
double number = num;

在上例中,number 的值最後會是 10.0,在指定的動作時,如果右邊的數值型態比左邊的數值型態型態長度大時,超出可儲存範圍的部份會被自動消去,例如將浮點數指定給整數變數,則小數的部份會被自動消去,例子如下,num 最後的結果會是 3 而不是 3.14,而為了顯示正確的整數結果,輸出時要指定格式指定字 %d

int num = 0;
double number = 3.14;
num = number; 
printf("%d\n", num);

在兩個整數型態相除時,也可以進行型態轉換,將其中一個型態轉換至 double 型態再進行運算,例如:

int number = 10;
printf("%f\n", (double) number / 3);

上例中結果會顯示 3.3333。