這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前言:運算子優先順序,是描述在電腦運算計算運算式時執行運算的先後順序。 先執行具有較高優先順序的運算,然後執行較低優先順序的運算。
一、算數運算子
下表列出了所有Go語言的算術運算子。假定 A 值為 10,B 值為 20。
| 運算子 |
描述 |
執行個體 |
| + |
相加 |
A + B 輸出結果 30 |
| - |
相減 |
A - B 輸出結果 -10 |
| * |
相乘 |
A * B 輸出結果 200 |
| / |
相除 |
B / A 輸出結果 2 |
| % |
求餘 |
B % A 輸出結果 0 |
| ++ |
自增 |
A++ 輸出結果 11 |
| -- |
自減 |
A-- 輸出結果 9 |
二、關係運算子
下表列出了所有Go語言的關係運算子。假定 A 值為 10,B 值為 20。
| 運算子 |
描述 |
執行個體 |
| == |
檢查兩個值是否相等,如果相等返回 True 否則返回 False。 |
(A == B) 為 False |
| != |
檢查兩個值是否不相等,如果不相等返回 True 否則返回 False。 |
(A != B) 為 True |
| > |
檢查左邊值是否大於右邊值,如果是返回 True 否則返回 False。 |
(A > B) 為 False |
| < |
檢查左邊值是否小於右邊值,如果是返回 True 否則返回 False。 |
(A < B) 為 True |
| >= |
檢查左邊值是否大於等於右邊值,如果是返回 True 否則返回 False。 |
(A >= B) 為 False |
| <= |
檢查左邊值是否小於等於右邊值,如果是返回 True 否則返回 False。 |
(A <= B) 為 True |
三、邏輯運算子
下表列出了所有Go語言的邏輯運算子。假定 A 值為 True,B 值為 False。
| 運算子 |
描述 |
執行個體 |
| && |
邏輯 AND 運算子。 如果兩邊的運算元都是 True,則條件 True,否則為 False。 |
(A && B) 為 False |
| || |
邏輯 OR 運算子。 如果兩邊的運算元有一個 True,則條件 True,否則為 False。 |
(A || B) 為 True |
| ! |
邏輯 NOT 運算子。 如果條件為 True,則邏輯 NOT 條件 False,否則為 True。 |
!(A && B) 為 True |
四、位元運算符
位元運算符對整數在記憶體中的二進位位進行操作。假定 A 為60,B 為13
| 運算子 |
描述 |
執行個體 |
| & |
按位與運算子"&"是雙目運算子。 其功能是參與運算的兩數各對應的二進位相與。 |
(A & B) 結果為 12, 二進位為 0000 1100 |
| | |
按位或運算子"|"是雙目運算子。 其功能是參與運算的兩數各對應的二進位相或 |
(A | B) 結果為 61, 二進位為 0011 1101 |
| ^ |
按位異或運算子"^"是雙目運算子。 其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。 |
(A ^ B) 結果為 49, 二進位為 0011 0001 |
| << |
左移運算子"<<"是雙目運算子。左移n位就是乘以2的n次方。 其功能把"<<"左邊的運算數的各二進位全部左移若干位,由"<<"右邊的數指定移動的位元,高位丟棄,低位補0。 |
A << 2 結果為 240 ,二進位為 1111 0000 |
| >> |
右移運算子">>"是雙目運算子。右移n位就是除以2的n次方。 其功能是把">>"左邊的運算數的各二進位全部右移若干位,">>"右邊的數指定移動的位元。 |
A >> 2 結果為 15 ,二進位為 0000 1111 |
示範樣本:
package mainimport "fmt"func main() { var a int = 60 //二進位是:111100 var b int = 13 //二進位是:001101 fmt.Printf("%b\n%d\n",a&b,a&b) //二進位是:1100,對應的十進位是12。說明&進行的是上下對應位的與操作 fmt.Printf("%b\n%d\n",a|b,a|b) //二進位是:111101,對應的十進位是61。說明&進行的是上下對應位的或操作 fmt.Printf("%b\n%d\n",a^b,a^b) //二進位是:110001,對應的十進位是49。^位元運算符是上下對應位不同時,值為1}
左移右移運算子樣本(實現計算機儲存單位):
package mainimport "fmt"const ( KB float64 = 1<<(10*iota) //iota是 const 結構裡面,定義常量行數的索引器,每個 const 裡面,iota 都從 0 開始 MB //下面是一個省略調用,繼承了上面的運算式 GB TB PB)func main() { fmt.Printf("1MB = %vKB\n",MB) fmt.Printf("1GB = %vKB\n",GB) fmt.Printf("1TB = %vKB\n",TB) fmt.Printf("1PB = %vKB\n",PB)}運行結果:1MB = 1024KB1GB = 1.048576e+06KB1TB = 1.073741824e+09KB1PB = 1.099511627776e+12KB
五、賦值運算子
下表列出了所有Go語言的賦值運算子。假定 A 為21
| 運算子 |
描述 |
執行個體 |
| = |
簡單的賦值運算子,將一個運算式的值賦給一個左值 |
C = A 將 A 賦值給 C,結果:21 |
| += |
相加後再賦值 |
C += A 等於 C = C + A,結果:42 |
| -= |
相減後再賦值 |
C -= A 等於 C = C - A,結果:21 |
| *= |
相乘後再賦值 |
C *= A 等於 C = C * A,結果:441 |
| /= |
相除後再賦值 |
C /= A 等於 C = C / A,結果:21 |
| %= |
求餘後再賦值 |
C %= A 等於 C = C % A,結果:0//不記入計算 |
| <<= |
左移後賦值 |
C <<= 2 等於 C = C << 2,結果:84 |
| >>= |
右移後賦值 |
C >>= 2 等於 C = C >> 2,結果:21 |
| &= |
按位與後賦值 |
C &= 2 等於 C = C & 2,結果:0 |
| ^= |
按位異或後賦值 |
C ^= 2 等於 C = C ^ 2,結果:2 |
| |= |
按位或後賦值 |
C |= 2 等於 C = C | 2,結果:2 |
六、其他運算子
| 運算子 |
描述 |
執行個體 |
| & |
返回變數儲存地址 |
&a; 將給出變數的實際地址。 |
| * |
指標變數。 |
*a; 是一個指標變數 |
記憶體位址和指標的樣本:列印變數類型用%T
package mainimport "fmt"func main() { var a int = 4 var b int32 var c float32 var ptr *int fmt.Printf("a 變數類型為 = %T\n", a ) //輸出變數類型%T fmt.Printf("b 變數類型為 = %T\n", b ) fmt.Printf("c 變數類型為 = %T\n", c ) ptr = &a fmt.Printf("a 的記憶體位址為 = %p",ptr) //go裡面的記憶體塊地址通常都是用十六進位表示的,因此輸出:0x10414020a fmt.Printf("*ptr 為 %d\n", *ptr) //這是個指向a的記憶體位址的指標,因此輸出:4}
七、運算子優先順序
有些運算子擁有較高的優先順序,二元運算子的運算方向均是從左至右。下表列出了所有運算子以及它們的優先順序,由上至下代表優先順序由高到低:
優先順序 運算子 7 ^ ! 6 * / % << >> & &^ 5 + - | ^ 4 == != < <= >= > 3 <- 2 && 1 ||
當然,你可以通過使用括弧來臨時提升某個運算式的整體運算優先順序。
參考:http://www.runoob.com/go/go-operators.html
為了方便大家交流,本人開通了公眾號(關注看更多精彩)和QQ群,QQ群1(291519319)和QQ群2(659336691)。喜歡技術的一起來交流吧