運算子優先順序

當運算式包含了一個以上的運算子,程式會根據運算子的優先順序作運算,例如以下的四則運算 :
int testValue 
testValue  = 2 * 5 +  6/2
第二個運算式包含了三個運算子,分別是 * 、 + 以及 / 等,依先乘除後加減的數學規則進行計算,首先取得 2 * 5 以及 6 / 2 的計算結果,然後使用加法運算子 + 將這兩個結果作加總,其中運算子 * 以及 / 優先被執行,接下來才是 + ,當這段程式執行時,同樣的也是依據此種順序作運算。

除了算術運算子,其它的運算子均有其一定的運算優先順序,運算順序高的運算子會比運算順序低的運算子優先被執行。下表列舉運算子分類的運算順序,運算順序由上而下,愈上層的運算子在運算式中愈早被執行,同一欄的運算子具有相同的優先順序。

類型運算子
主要x.y f(x) a[x] x++ x-- new typeof checked unchecked
一元+ - ! ~ ++x --x (T)x
乘法類* / %
加法類+ -
移位<< >>
關係和型別測試<  >  <=  >=  is  as
相等== !=
邏輯AND&
邏輯XOR^
邏輯OR|
條件式AND&&
條件式OR||
條件式t ? x : y
條件式= *= /= %= += -= <<= >>= &= ^= |=

你可以在線上文件的運算子查到這個表的相關內容

這個表格說明了運算子的一般運算順序,而在運算式中,還可以藉由括弧 ( ) 調整運算子的運算順序,將想要優先運算的運算子放置於括弧 ( ) 內,當程式開始執行的時候,括弧 ( ) 內的運算子會優先被執行,如下式:
testValue  = 2 * (5 + 6) / 2
其中先計算 5 + 6 得到 11 ,然後是進行 2 * 11 / 2 的運算,括弧 ( ) 內的運算子 + 並不會受到上述表列的運算順序所約束,具有最高的運算優先順序,你也可以進一步使用巢狀括弧,設定所需的運算順序。

若是運算子具有相同的運算順序,則依據運算子的順序關聯性進行運算,一般使用兩個運算元的二元運算子,遵循左順序關聯性,由運算式的左邊開始作運算,例如以下的運算式:
x + y - z 
運算子 + 以及 - 具有相同的運算順序,因此運算式依序執行 x + y,接著執行 - 運算子,將所得的結果減掉 z 的數值。

沒有留言: