From Gossip@caterpillar

C Gossip: 算術(Arithmetic)運算、型態轉換(Type conversion)

在中提供與算術相關的 加(+)、減(-)、乘(*)、除(/)的運算子,另外還有一個也很常用的餘除運算子(%)或稱模數(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不斷循環:
couter = (counter + 1) % 10;

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

答案不是3.3333,而是3,小數點之後的部份被自動消去了,這是因為您的number是整數,而除數3也是整數,運算出來的程式被自動轉換為整數了,而為了正確的顯示運算的整數結果,還要使用%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。