運算子介紹
訂閱 480
運算子
對於程式中存在的各種資料,他們的一項重要活動就是參與運算,而運算需要通過運算子來完成,他會根據特定的規則,對給出的運算元進行運算,然後傳回運算的結果。
什麽是運算元?
運算元是指參與運算子運算的具體目標,他們可以是常值,變數,運算式,以及可傳回或包含值的實體。
運算子是一種特殊的函式?
不管程式碼中的運算子是如何書寫的,他們與函式在本質上是相同的,均被用於完成某種運算,並具有輸入和輸出,與運算子關聯的運算元類似於函式的參數。
指派運算子
指派運算子會將右運算元的計算結果賦予左運算元,最為常見的是=。當然,指派運算子可以變得更為複雜,比如,+=會先將右運算元的計算結果與左運算元的計算結果相加,再將相加的結果賦予左運算元。
指派運算子的左運算元需要是一個可儲存值的實體,比如,變數,類別的屬性等。
指派運算子對運算元資料型別的要求
指派運算子右運算元所計算出的值的資料型別,需要與左運算元保持一致,或可進行隱含轉換,如果語言要求型別安全的話。
在 C# 中,直接將10000000指派給字串型別的變數是行不通的,因為整數型別不能隱含轉換為字串型別。
// ERROR 下面的指派是錯誤的,整數型別無法隱含轉換為字串型別
string num = 10000000;算術運算子
算術運算子用於對運算元進行數學運算,這包含了經典的加減乘除(+,-,*,/),遞增(++),遞減(--)等。
字串型別的加法運算
需要指出,在大部分語言中,對字串使用加法算術運算子(+),相當於將左右兩邊的字串拼接在一起,然後作為一個新的字串傳回。
比較運算子
比較運算子一般用於對比兩邊的運算元是否相等,不相等,大於,小於,大於等於或小於等於,並傳回一個表示對比結果的布林值。
比較運算子的嚴格比較
由於運算元升階的存在,一些語言支援嚴格的比較運算子,以避免資料型別發生隱含轉換。
在 JavaScript 中,運算式1=='1'將傳回true,而1==='1'將傳回false,因為===是嚴格的比較運算子,不允許隱含轉換。
// == 允許資料型別隱含轉換,運算式結果為 true
console.log(1 == '1')
// == 不允許資料型別隱含轉換,運算式結果為 false
console.log(1 === '1')true
false值,資料型別
想要了解資料型別的隱含轉換,你可以檢視資料型別轉換一段。
邏輯運算子
邏輯運算子通常用於流程控製,他的表面效果為判斷左右兩邊的條件是否全部成立(&&或and),或左右兩邊的條件是否至少一個成立(||或or),或條件是否不成立(!或not)。
什麽是邏輯運算子的短路解析?
事實上,邏輯運算子只是傳回左右兩邊某個運算元的計算結果,這些結果將等價於一個布林值,當運算沒有必要繼續進行時,右運算元將被丟棄,這被稱為短路解析。
在下面的 JavaScript 程式碼中,'A'&&'B'傳回'B',因為需要計算左右兩邊的運算元,才能確保條件均成立,'A'||'B'傳回'A',因為左運算元已確保有一個條件成立,沒有必要再計算右運算元。
// 'A' 和 'B' 都會被計算
console.log('A' && 'B')
// 'A' 會被計算 ,'B' 將被丟棄
console.log('A' || 'B')B
A位元運算子
位元運算子進行的計算,是以運算元的二進位格式為基礎的,你可能很少見到該運算子的出現,因為他的作用比較隱晦,一般是為了實作數學上的某些驚人訣竅。
運算元升階
當運算子運算元的資料型別不相同時,可能會進行運算元升階,運算元將被隱含轉換為某種資料型別,然後才會參與運算。至於升階的具體規則,需要視具體的運算子和語言而定。
在下面的 C# 程式碼中,1會隱含轉換為浮點數型別,然後再與1f進行加法運算。
// 1 會被隱含轉換為浮點數型別
Console.WriteLine((1f + 1).GetType());System.Single運算子優先順序
當一個運算式中存在多個運算子時,將按照他們的優先順序來決定處理順序。如果你不能確定,那麽可以使用()括住希望優先處理的部分,這在大部分語言中是可行的。比如,對於運算式1*2+3,可以使用()來優先處理加法運算子,1*(2+3)。
運算子關聯性
如果運算子的優先順序相同,那麽先處理誰取決於運算子的關聯性,大部分的二元運算子是左關聯的,計算會按照從左到右的順序進行,比如,1+2+3的計算順序是(1+2)+3,而不是1+(2+3)。至於右關聯運算子,其數量較少,指派運算子是其中之一,比如,a=b=c的計算順序是a=(b=c),而不是(a=b)=c。
運算元計算順序
在一個運算式中,運算元的計算順序與運算子的優先順序或關聯性無關,他們會從左到右依次被計算。
在下面的 JavaScript 程式碼中,運算元b()和c()並沒有因為()而被優先計算。
// 四個作為運算元的函式
a = () => {
console.log('a')
return 1
}
b = () => {
console.log('b')
return 2
}
c = () => {
console.log('c')
return 3
}
d = () => {
console.log('d')
return 4
}
// b() 和 c() 並不會被優先計算
const result = a() / (b() + c()) * d()
console.log(result)a
b
c
d
0.8原始碼
operators.cs·codebeatme/programming·GitHub
operators.js·codebeatme/programming·GitHub