《Go語言四十二章經》第九章 運算子
《Go語言四十二章經》第九章 運算子
作者:李驍
9.1 內建運算子
- 算術運算子
- 關係運算符
- 邏輯運算子
- 位運算子
- 賦值運算子
- 其他運算子
Go語言的算術運算子:
|運算子|含義|示意| |:--|:--|:--| |+|相加|A + B | |-|相減|A - B | |*|相乘|A * B | |/|相除|B / A 結果還是整數 8/3=2| |%|求餘|B % A | |++|自增|A++ 1| |--|自減|A-- |
Go語言的關係運算符:
|運算子|含義|示意| |:--|:--|:--| |==|檢查兩個值是否相等。|(A == B) 為 False| |!=|檢查兩個值是否不相等。|(A != B) 為 True| |>|檢查左邊值是否大於右邊值。|(A > B) 為 False| |<|檢查左邊值是否小於右邊值。|(A < B) 為 True| |>=|檢查左邊值是否大於等於右邊值。|(A >= B) 為 False| |<=|檢查左邊值是否小於等於右邊值。|(A <= B) 為 True |
Go語言的邏輯運算子:
|運算子|操作|含義| |:--|:--|:--| |&&|邏輯與|如果兩邊的運算元都是 True,則條件 True,否則為 False。| ||||邏輯或| 如果兩邊的運算元有一個 True,則條件 True,否則為 False。| |!|邏輯非|如果條件為 True,則邏輯 NOT 條件 False,否則為 True。 |
Go語言的位運算子:
位運算子對整數在記憶體中的二進位制位進行操作。 下表列出了位運算子 &,|,和 ^ 的計算:
|位|位|& 與|| 或|^ 異或| |:--|:--:|:--:|:--:|:--:| |p|q|p& q | p | q|p ^ q| |0|0|0 |0|0| |0|1|0|1|1| |1|1|1|1|0| |1|0|0|1|1|
Go 語言支援的位運算子含義。
-
&按位與運算子"&"是雙目運算子。 其功能是參與運算的兩數各對應的二進位相與。
-
|按位或運算子"|"是雙目運算子。 其功能是參與運算的兩數各對應的二進位相或。
-
^按位異或運算子"^"是雙目運算子。 其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。
-
<<左移運算子"<<"是雙目運算子。左移n位就是乘以2的n次方。 其功能把"<<"左邊的運算數的各二進位全部左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0。
-
>>右移運算子">>"是雙目運算子。右移n位就是除以2的n次方。 其功能是把">>"左邊的運算數的各二進位全部右移若干位,">>"右邊的數指定移動的位數。
Go語言的賦值運算子:
|運算子|含義|示意| |:--|:--|:--| |=|簡單的賦值運算子|| |+=|相加後再賦值|C += A 等於 C = C + A| |-=|相減後再賦值|C -= A 等於 C = C - A| |*=|相乘後再賦值|C *= A 等於 C = C * A| |/=|相除後再賦值|C /= A 等於 C = C / A| |%=|求餘後再賦值|C %= A 等於 C = C % A| |<<=|左移後賦值 |C <<= 2 等於 C = C << 2| |>>=|右移後賦值 |C >>= 2 等於 C = C >> 2| |&=|按位與後賦值|C &= 2 等於 C = C & 2| |^=|按位異或後賦值|C ^= 2 等於 C = C ^ 2| ||=|按位或後賦值|C |= 2 等於 C = C | 2|
Go語言的其他運算子:
|運算子|含義| |:--|:--|:--| |&|返回變數儲存地址&a; 將給出變數的實際地址。| |*|指標變數。*a; 是一個指標變數|
9.2 運算子優先順序
有些運算子擁有較高的優先順序,二元運算子的運算方向均是從左至右。下表列出了所有運算子以及它們的優先順序,由上至下代表優先順序由高到低:
|優先順序|運算子| |:--|:--| |7 |^ !| |6 |* / % << >> & &^| |5 |+ - | ^| |4 |== != < <= >= >| |3 |<-| |2 |&&| |1 ||||
當然,你可以通過使用括號來臨時提升某個表示式的整體運算優先順序。
9.3 幾個特殊運算子
位清除 &^:
將指定位置上的值設定為 0。將運算子左邊資料相異的位保留,相同位清零 :
X=2 Y=4 x&^y==x&(^y)
首先我們先換算成2進位制0000 0010 &^ 0000 0100 = 0000 0010 如果y bit位上的數是0則取x上對應位置的值, 如果y bit位上為1則結果位上取0
1、如果右側是0,則左側數保持不變
2、如果右側是1,則左側數一定清零
3、功能同a&(^b)相同
4、如果左側是變數,也等同於:
var a int a &^= b
^(XOR) 在Go語言中XOR是作為二元運算子存在的:
但是如果是作為一元運算子出現,他的意思是按位取反。
如果作為二元運算子則是, XOR是不進位加法計算,也就是異或計算。0000 0100 + 0000 0010 = 0000 0110 = 6
常見可用於整數和浮點數的二元運算子有 +、-、* 和 /。 (相對於一般規則而言,Go 在進行字串拼接時允許使用對運算子 + 的過載,但 Go 本身不允許開發者進行自定義的運算子過載)
對於整數運算而言,結果依舊為整數,例如:9 / 4 -> 2。
取餘運算子只能作用於整數:9 % 4 -> 1。
浮點數除以 0.0 會返回一個無窮盡的結果,使用 +Inf 表示。
你可以將語句 b = b + a 簡寫為 b+=a,同樣的寫法也可用於 -=、*=、/=、%=。
對於整數和浮點數,你可以使用一元運算子 ++(遞增)和 --(遞減),但只能用於字尾:
i++ -> i += 1 -> i = i + 1
i-- -> i -= 1 -> i = i - 1
同時,帶有 ++ 和 -- 的只能作為語句,而非表示式,因此 n = i++ 這種寫法是無效的。
函式 rand.Float32 和 rand.Float64 返回介於 [0.0,1.0) 之間的偽隨機數,其中包括 0.0 但不包括 1.0。函式 rand.Intn 返回介於 [0,n) 之間的偽隨機數。
你可以使用 Seed(value) 函式來提供偽隨機數的生成種子,一般情況下都會使用當前時間的納秒級數字。
本書《Go語言四十二章經》內容在github上同步地址:https://github.com/ffhelicopter/Go42 本書《Go語言四十二章經》內容在簡書同步地址:https://www.jianshu.com/nb/29056963