求值順序
表達式可以由許多嵌套的子表達式構成。子表達式的求值順序可以使表達式的最終值發生
變化。
例如,已知表達式3*5+2,依照子表達式的求值順序,有兩種可能的結果,如圖9-3所示。
- 如果乘法先執行,結果是17。
- 如果5和2首先相加,結果為21。
優先級
我們小學時就知道,在前面的示例中,乘法必須在加法之前執行,因為乘法比加法有更高的
優先級。讀小學的時候有4個運算符和兩個優先級級別,但C#中情況更復雜一些,它有超過45
個運算符和14個優先級級別。
全部的運算符和它們的優先級如表9-4所示。該表把最高優先級運算符列在頂端,之后優先
級持續下降,底端運算符優先級最低。
結合性
假設編譯器正在計算一個表達式,且該表達式中所有運算符都有不同的優先級,那么編譯器
將計算每個子表達式,從級別最高的開始,按優先等級從高到低一直計算下去。
但如果兩個連續的運算符有相同的優先級別怎么辦?例如,已知表達式2/6*4,有兩個可能
的求值順序:
(2/6)*4=4/3
或
2/(6*4)=1/12
當連續的運算符有相同的優先級時,求值順序由操作結合性決定。也就是說,已知兩個相同
優先級的運算符,依照運算符的結合性,其中的一個或另一個優先。運算符結合性的一些重要特
征如下所示,另外,表9-5對此做了總結。
- 左結合運算符從左至右求值。
- 右結合運算符從右至左求值。
- 除賦值運算符以外,其他二元運算符是左結合的。
- 賦值運算符和條件運算符是右結合的。
因此,已知這些規則,前面的示例表達式應該從左至右分組為(2/6)*4,得到4/3。
可以使用圓括號顯式地設定子表達式的求值順序。括號內的子表達式:
- 覆蓋優先級和結合性規則;
- 求值順序從嵌套的最內層到最外層。
簡單算術運算符
簡單算術運算符執行基本四則算術運算,如表9-6所示。這些運算符是二元左結合運算符。
算術運算符在所有預定義簡單數學類型上執行標準的算術運算。