作者:李驍
9.1 內(nèi)置運算符
- 算術(shù)運算符
- 關(guān)系運算符
- 邏輯運算符
- 位運算符
- 賦值運算符
- 其他運算符
Go語言的算術(shù)運算符:
運算符 | 含義 | 示意 |
---|---|---|
+ | 相加 | A + B |
- | 相減 | A - B |
* | 相乘 | A * B |
/ | 相除 | B / A 結(jié)果還是整數(shù) 8/3=2 |
% | 求余 | B % A |
++ | 自增 | A++ 1 |
-- | 自減 | A-- |
Go語言的關(guān)系運算符:
運算符 | 含義 | 示意 |
---|---|---|
== | 檢查兩個值是否相等咳焚。 | (A == B) 為 False |
!= | 檢查兩個值是否不相等管闷。 | (A != B) 為 True |
> | 檢查左邊值是否大于右邊值。 | (A > B) 為 False |
< | 檢查左邊值是否小于右邊值。 | (A < B) 為 True |
>= | 檢查左邊值是否大于等于右邊值撞牢。 | (A >= B) 為 False |
<= | 檢查左邊值是否小于等于右邊值。 | (A <= B) 為 True |
Go語言的邏輯運算符:
運算符 | 操作 | 含義 |
---|---|---|
&& | 邏輯與 | 如果兩邊的操作數(shù)都是 True童叠,則條件 True结闸,否則為 False。 |
|| | 邏輯或 | 如果兩邊的操作數(shù)有一個 True坎弯,則條件 True纺涤,否則為 False。 |
! | 邏輯非 | 如果條件為 True抠忘,則邏輯 NOT 條件 False撩炊,否則為 True。 |
Go語言的位運算符:
位運算符對整數(shù)在內(nèi)存中的二進制位進行操作崎脉。
下表列出了位運算符 &拧咳,|,和 ^ 的計算:
位 | 位 | & 與 | | 或 | ^ 異或 |
---|---|---|---|---|
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 語言支持的位運算符含義囚灼。
& 按位與運算符"&"是雙目運算符骆膝。 其功能是參與運算的兩數(shù)各對應(yīng)的二進位相與。
| 按位或運算符"|"是雙目運算符灶体。 其功能是參與運算的兩數(shù)各對應(yīng)的二進位相或阅签。
^ 按位異或運算符"^"是雙目運算符。 其功能是參與運算的兩數(shù)各對應(yīng)的二進位相異或蝎抽,當(dāng)兩對應(yīng)的二進位相異時愉择,結(jié)果為1。
<< 左移運算符"<<"是雙目運算符。左移n位就是乘以2的n次方锥涕。 其功能把"<<"左邊的運算數(shù)的各二進位全部左移若干位衷戈,由"<<"右邊的數(shù)指定移動的位數(shù),高位丟棄层坠,低位補0殖妇。
>> 右移運算符">>"是雙目運算符。右移n位就是除以2的n次方破花。 其功能是把">>"左邊的運算數(shù)的各二進位全部右移若干位谦趣,">>"右邊的數(shù)指定移動的位數(shù)。
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 運算符優(yōu)先級
有些運算符擁有較高的優(yōu)先級,二元運算符的運算方向均是從左至右峭梳。下表列出了所有運算符以及它們的優(yōu)先級舰绘,由上至下代表優(yōu)先級由高到低:
優(yōu)先級 | 運算符 |
---|---|
7 | ^ ! |
6 | * / % << >> & &^ |
5 | + - | ^ |
4 | == != < <= >= > |
3 | <- |
2 | && |
1 | || |
當(dāng)然,你可以通過使用括號來臨時提升某個表達式的整體運算優(yōu)先級葱椭。
9.3 幾個特殊運算符
位清除 &^:
將指定位置上的值設(shè)置為 0捂寿。將運算符左邊數(shù)據(jù)相異的位保留,相同位清零 :
X=2
Y=4
x&^y==x&(^y)
首先我們先換算成2進制 0000 0010 &^ 0000 0100 = 0000 0010 如果y bit位上的數(shù)是0則取x上對應(yīng)位置的值孵运, 如果y bit位上為1則結(jié)果位上取0
1秦陋、如果右側(cè)是0,則左側(cè)數(shù)保持不變
2治笨、如果右側(cè)是1驳概,則左側(cè)數(shù)一定清零
3、功能同a&(^b)相同
4旷赖、如果左側(cè)是變量抡句,也等同于:
var a int
a &^= b
^(XOR) 在Go語言中XOR是作為二元運算符存在的:
但是如果是作為一元運算符出現(xiàn),他的意思是按位取反杠愧。
如果作為二元運算符則是, XOR是不進位加法計算待榔,也就是異或計算。0000 0100 + 0000 0010 = 0000 0110 = 6
常見可用于整數(shù)和浮點數(shù)的二元運算符有 +流济、-锐锣、* 和 /。
(相對于一般規(guī)則而言绳瘟,Go 在進行字符串拼接時允許使用對運算符 + 的重載雕憔,但 Go 本身不允許開發(fā)者進行自定義的運算符重載)
對于整數(shù)運算而言,結(jié)果依舊為整數(shù)糖声,例如:9 / 4 -> 2斤彼。
取余運算符只能作用于整數(shù):9 % 4 -> 1分瘦。
浮點數(shù)除以 0.0 會返回一個無窮盡的結(jié)果,使用 +Inf 表示琉苇。
你可以將語句 b = b + a 簡寫為 b+=a嘲玫,同樣的寫法也可用于 -=、*=并扇、/=去团、%=。
對于整數(shù)和浮點數(shù)穷蛹,你可以使用一元運算符 ++(遞增)和 --(遞減)土陪,但只能用于后綴:
i++ -> i += 1 -> i = i + 1
i-- -> i -= 1 -> i = i - 1
同時,帶有 ++ 和 -- 的只能作為語句肴熏,而非表達式,因此 n = i++ 這種寫法是無效的蛙吏。
函數(shù) rand.Float32 和 rand.Float64 返回介于 [0.0源哩,1.0) 之間的偽隨機數(shù),其中包括 0.0 但不包括 1.0出刷。函數(shù) rand.Intn 返回介于 [0,n) 之間的偽隨機數(shù)坯辩。
你可以使用 Seed(value) 函數(shù)來提供偽隨機數(shù)的生成種子馁龟,一般情況下都會使用當(dāng)前時間的納秒級數(shù)字。
本書《Go語言四十二章經(jīng)》內(nèi)容在github上同步地址:https://github.com/ffhelicopter/Go42
雖然本書中例子都經(jīng)過實際運行漆魔,但難免出現(xiàn)錯誤和不足之處坷檩,煩請您指出;如有建議也歡迎交流改抡。
聯(lián)系郵箱:roteman@163.com