3-3 運算子

我們在 3-1 變數與基本常用的型別 談到變數定義的時候,有說過:

=運算子的意義是:將右邊的值指定給左邊的變數
int i = 3;
float f = 7.5f;

我們可以先進行一些資料計算與處理,然後將指定的值透過=運算子指定給變數。
以下就來介紹這些運算子。

算法運算

● +運算子:通常是數學上將2個數值相加的功能
● -運算子:通常是數學上將2個數值相減的功能
● *運算子:通常是數學上將2個數值相乘的功能
● /運算子:通常是數學上將2個數值相除的功能

int i1 = 3 + 1; ( i1 = 4 )
float f2 = 0.5f – 0.25f; ( f2 = 0.25f )
int i3 = 9 * 6; ( i3 = 54 )
int i4 = 9 / 3; ( i4 = 3 )

此外,string型別也能使用+運算子,其功能是將2個字串合併,例如:

string s = “Hello” + ” ” + “World” + “!”;
( s = “Hello World!” )

注意:/運算子在整數的細節

思考一下這個例子:

int i = 9 / 6;
請問 i 等於多少?

9 / 6 在數學是 1.5,
9 / 6 在程式的整數,不可能是 1.5,
因為整數是不會有小數點的。

在C#,這時候會做無條件捨去小數點以下的數字成為整數。
例如:

int a = 9 / 6;
( a = 1,從 1.5 無條件捨去小數點以下的數字)

int b = -9 / 6;
( b = -1,從 -1.5 無條件捨去小數點以下的數字)

算法指派

既然介紹完算法運算,來介紹+=這個運算子

x = x + y
可以縮寫成
x += y

同理,-= *= /= %=也有一樣的邏輯。

遞增與遞減運算

● ++x:前置遞增,將 x 加上整數 1,然後回傳新的 x
● –x:前置遞減,將 x 減去整數 1,然後回傳新的 x

● x++:後置遞增,先保留 x 的值,將 x 加上整數 1,然後回傳舊的 x
● x–:後置遞減,先保留 x 的值,將 x 減去整數 1,然後回傳舊的 x

int x = 3;
int y = ++x; (x = 4, y = 4)
y = x++; (x = 5, y = 4)
y = x++ * 2; (x = 6, y = 10)

請注意前置與後置的差異:
你可以想像成前置是先做遞增減,再做其它運算;

而後置是先拿原數值做運算,再做遞增減。

關係與等號運算

相關的運算子有>, <, >=, <=, ==, !=,與數學上的用法類似,會回傳bool來表達正確性。

● >運算子:大於
● <運算子:小於
● >=運算子:大於或等於
● <=運算子:小於或等於
● ==運算子:等於 (注意==和=這2個運算子是不一樣的)
● !=運算子:不等於

例如:

int a1 = 1;
int a2 = 2;
int a3 = 3;
int a4 = 4;

bool b1 = a1 > a4; ( b1 = false )
bool b2 = a1 < a3; ( b2 = true )
bool b3 = a4 >= 4; ( b3 = true )
bool b4 = a1 <= 0; ( b4 = false )
bool b5 = a2 == 2; ( b5 = true )

位移運算

● x << y:整數型別限定,將x的位元全部向左移y位,超出的位元即捨棄,空白位元補上0
● x >> y:整數型別限定,將x的位元全部向右移y位,超出的位元即捨棄,空白位元補上0

int a = 9 << 2; ( a = 40 )
( 0000 1010 -> 0010 1000 )

int b = 9 >> 2; ( b = 2 )
( 0000 1010 -> 0000 0010 )

與算法指派相同,也有邏輯指派的運算子 <<= >>=

邏輯運算

● &運算子:整數的位元AND,或是布林值的AND
● ^運算子:整數的位元XOR,或是布林值的XOR
● |運算子:整數的位元OR,或是布林值的OR

與算法指派相同,也有邏輯指派的運算子 &= ^= |=

條件邏輯

● &&運算子:內建是bool型別限定的運算子,與數學上的AND定義相同
如果左邊的運算結果是false,則直接回傳false。
如果左邊的運算結果是true,則回傳右邊的計算結果。

● ||運算子:內建是bool型別限定的運算子,與數學上的OR定義相同
如果左邊的運算結果是true,則直接回傳true。
如果左邊的運算結果是false,則回傳右邊的計算結果。

注意:
以上運算子跟 &, | 這2個運算子的整體邏輯乍看沒有什麼不一樣,
但請注意 && 與 || 的算法是,先判斷左邊的運算元,有需要才判斷右邊的運算元

需要判斷條件時,通常會選擇 && 和 ||。

運算優先度

我們讀小學的時候都學過的「先乘除,後加減」以及「括號」,在C#也有一樣的作用。
只是C#的運算子很多,這裡列出基本常用的運算子優先度。
下表將優先度從上到下,由高到低排列,越上面的優先度越高,同一層級的運算子有相同的優先度。

一元運算子:+x -x !x ~x ++x –x
乘法運算子:* / %
加法運算子:+ –
移位運算子:<< >>
關係運算子:< > <= >=
等號運算子:== !=
邏輯AND運算子:&
邏輯XOR運算子:^
邏輯OR運算子:|
條件AND運算子:&&
條件OR運算子:||
指派運算子:= += -= *= /= %= &= |= ^= <<= >>=