設值與數術運算

算術與設值運算子,幾乎就是一般數學運算最常用的運算子,即使非程式設計人員對於這一類的運算子應當也會相當熟悉,以下針對這兩類運算子作說明,除此之外,遞增與遞減運算子同樣牽涉類似的數值加減運算,於此一併作討論。

設值運算子(Assignment)

設值運算子使用「=」符號連接兩個運算元,其中位於「=」右邊的運算元會被儲存至左邊運算元,左邊的運算元通常是一個變數,如下式:
int testValue  ; 
testValue  = 10 ; 
這一段運算式使用 = 符號,將整數值10指定給宣告為int型別的變數testValue,當程式執行這段運算式完畢,testValue變數儲存了10的整數值,因此你可以在往後的運算式裏直接使用testValue當作10作運算,當然你也可以隨時使用 = 符號改變其儲存的資料內容。

設值運算子,可以用來指定任何型別相容的值至左邊的運算元,例如將testValue宣告為類別物件型別,你便可以使用其儲存特定的相容型別物件,除此之外,我們也可以將一段運算式指定給變數值,稍後的內容將會看到相關的實作範例。

使用設值運算子必須特別注意型別衝突的問題,運算式只能夠將型別相容的值儲存至左邊的運算元,由於作為「=」的運算元,可以是一個固定的常數值,也可以是一段運算式進行運算之後的結果,因此很可能發生右邊運算元的結果值,與右邊運算元不相容的情形,說明如下:



其中的 intValue 變數是一個宣告為 int 型別的變數,當一個整數值 100 被指定至變數的時候,這個過程沒有問題,而 100.01 本身是一個 double數值,因此當他被儲存至整數型別變數的時候,會導致錯誤發生。

算術運算子(Arithmetic)

算術運算子專門應用於數學加(+)、減(-)、乘(*)、除(/)等四則運算,這四個運算子與我們使用於一般數學上的計算相同,如下述的四則運算程式碼:
x + y
x - y
x * y
x / y
由上而下,這四段運算式分別對 x 、 y 這兩個變數所儲存的值作加(+)、減(-)、乘(*)、除(/)等簡單的數學四則運算,你可以使用前述的指定運算子,取得算術運算子的運算結果。

以下來看一個算術運算子的範例,其中示範說明如何利用算術運算子,進行數值資料的四則運算。
class Program
{
    static void Main(string[] args)
    {
        int intX;
        int intY;
        Console.WriteLine("請輸入第一個整數值 X :");
        intX = int.Parse(Console.ReadLine());
        Console.WriteLine("請輸入第二個整數值 y :");
        intY = int.Parse(Console.ReadLine());

        Console.WriteLine(" X+Y = {0}", intX + intY);
        Console.WriteLine(" X-Y = {0}", intX - intY);
        Console.WriteLine(" X*Y = {0}", intX * intY);
        Console.WriteLine(" X/Y = {0}", intX / intY);
        Console.ReadLine();
    }
}
其中定義兩個 int 變數 - intX 以及 intY ,分別透過 Console.WriteLine 取得使用者輸入的整數值,由於是字串,因此利用 int.Parse 轉換成為 int 型別,儲存至變數,轉換的動作避免可能發生的型別錯誤。

接下來逐一運用算術運子作四則運算,並且輸出運算結果:
請輸入第一個整數值 X :
200
請輸入第二個整數值 y :
100
 X+Y = 300
 X-Y = 100
 X*Y = 20000
 X/Y = 2
基本型別無論資料本身或是儲存資料的變數,在應用程式中組合成為各種運算式進行運算,運算結果可以透過設值符號「=」儲存至指定的變數,變數與變數、資料與變數之間同樣可以進行更複雜的運算。

模數運算子

數學運算子另外一個需要說明的便是模數運算子,以百分比符號 % 作表示,它的用途主要在於取得整數除法所得到的餘數,由於兩個整數進行除法運算時所產生的餘數會自動被捨棄,利用這個運算子可以取得除法運算所產生的餘數,兩個數值若剛好整除則回傳結果值 0 。
int x = 6%5
上面是一行執行 % 運算的運算式,其中的變數 x 最後的結果將得到餘數1。

以下的範例,示範透過 % 運算子進行兩個整數的除法運算,並且回傳其餘數。
class Program
{
    static void Main(string[] args)
    {
        int x = 100 % 33; 
        Console.WriteLine("100 % 33:" +x);            
        Console.ReadLine();
    }
}
首先將兩個整數進行 % 運算,並將運算結果儲存至 x 變數。

接下來再將 x 的結果值輸出。

整數與浮點數這兩種數值型別資料,通常被運用於加、減、乘、除等數學四則運算,並且遵守數學運算規則,除了上面的範例,其他比較複雜的運算,例如先乘除後加減、括弧優先運算等等,一樣可以透過運算子與運算元的結合來完成。

底下為另外一種形式的運算式,其中兩個變數相乘加上一個常數值之後,將結果指定給另外一個結果變數:
intResult = 5 + intFirst*intSecond ; 
如同一般的數學運算,其中變數 intFirst 與 intSecond 先行相乘,得到的結果再加上 5之後,儲存至結果變數 intResult ,你也可以嘗試在前面加上括弧,改變其運算順序,如下式,其中常數5會先與變數intFirst進行加總運算,然後再將結果乘上第二個變數intSecond,得到與上述不同的運算結果。
intResult = (5 + intFirst)*intSecond ; 
從上面的說明我們可以很清楚的了解,不論常數值或是變數,都可以被運用在一般運算式中,以數學邏輯進行運算,只要了解一般的數學運算規則,通常就有能力編寫類似的數學運算式。

型別轉換錯誤

使用算術運算子必須注意溢位的問題,當兩個數值進行數值運算,很容易發生超出指定數值型別範圍值以外的狀況,並且產生溢位錯誤訊息,你可以藉由限制運算的數值,或是加入程式除錯機制,補捉可能發生的錯誤。

在某些情形下,資料經過運算之後所產生的結果,會發生與儲存結果目標變數型別衝突的情形,例如兩個 byte 型別的整數相乘之後,結果值可能超出 byte 數值的範圍,也就是255 ,造成溢位結果,此時以一個定義為 int 型別的變數儲存運算結果就會導致錯誤,例如以下的運算式:
byte bValue = 255  ;
bValue = bValue * 2 ;
編譯包含此段程式碼的程式檔案,將出現型別無法轉換的錯誤,由於 bValue 本身等於255 ,乘上 2 之後的結果值 510 已經超過了 byte 數值的最大範圍,因此導致程式發生錯誤。
另外一種可能發生錯誤的地方,在於混用不同型別資料的運算,例如以下的運算式:
byte bValue; 
int aa= 0 ;
bValue = aa + 0;
其中的 aa 宣告為 int 型別,而且其值初始化為 0 ,而最後一行運算式當中,雖然變數aa 加上 0 的結果還是等於 0 ,小於 bValue 宣告 byte 的最大數值範圍 255 ,但是由於 aa 已經是 int 型別,其加上 0 的結果依然是一個 int 型別,而 int 型別本身的範圍大於 byte ,因此無法被儲存至 bValue 。

具小數點的數值運算,也是很容易產生型別錯誤的地方,例如將兩個具小數點的數值進行四則運算,如下式:
float f = 0;
f = 0.1 + 0.1;
其中 f 宣告為 float 型別,第二行將兩個具小數點的浮點數進行加總,因為沒有指定 f或是 F ,所以被視為 double 型別,兩個 double 型別的數值相加依然為 double 型別,因此不能被指定至一個 float 型別變數,將其中第二行修正如下:
f = 0.1f + 0.1f;
現在這一行程式碼明確的指定加總兩個 float 型別的數值,而不會發生類似的問題。






沒有留言: