運算符 -- 就要學習 Go 語言

今天,咱們來說下Go語言的算術運算符、比較運算符和邏輯運算符。學習

算術運算符

+    sum                    integers, floats, complex values (複數), strings
-    difference             integers, floats, complex values
*    product                integers, floats, complex values
/    quotient               integers, floats, complex values
%    remainder              integers

位運算符:
&    bitwise AND (按位與)                integers
|    bitwise OR (按位或)                 integers
^    bitwise XOR (按位異或)              integers
&^   bit clear (AND NOT 按位置零)        integers

移位運算符:
<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer
複製代碼

算術運算符+-*/適用於整數、浮點數和複數,+也適用於字符串,用於字符串鏈接;取模運算%僅適用整數間的運算,Go語言中,%取模運算符的結果的符號和被取模數的符號老是一致的,所以-5%3-5%-3結果都是-2。除法運算符/的結果依賴於操做數是否爲全爲整數,好比5.0/4.0的結果是1.25,可是5/4的結果是1,由於整數除法會向着0方向截斷餘數;位運算和移位運算只適用整型。 位操做運算符^,做爲一元運算符,表示按位取反,就是說,它返回一個每一個bit位都取反的數:做用相似在C、C#、Java語言中中符號~,對於有符號的整數來講,是按照補碼進行取反操做的(快速計算方法:對數a取反,結果爲-(a+1) );對於無符號整數來講就是按位取反。ui

var a int8 = 3
var b uint8 = 3
var c int8 = -3

fmt.Printf("^%b=%b %d\n", a, ^a, ^a) // ^11=-100 -4
fmt.Printf("^%b=%b %d\n", b, ^b, ^b) // ^11=11111100 252
fmt.Printf("^%b=%b %d\n", c, ^c, ^c) // ^-11=10 2
複製代碼

輸出:spa

^11=-100 -4
^11=11111100 252
^-11=10 2
複製代碼

做爲二元運算符時是按位異或:對應位,相同爲0,相異爲1。.net

var a int8 = 3
var c int8 = 5

fmt.Printf("a: %08b\n",a)
fmt.Printf("c: %08b\n",c)
fmt.Printf("a^c: %08b\n",a ^ c)
複製代碼

輸出:code

a: 00000011
c: 00000101
a^c: 00000110
複製代碼

加法和減法運算符:+-也能夠做爲一元操做符: 對於整數,+x0+x的簡寫,-x則是0-x的簡寫;對於浮點數和複數,+x就是x-x則是x的負數。 須要給你們提一下的是這個操做符:按位置零&^,表達式z = x &^ y,若是 y 中的bit位爲1,則 z 對應bit位爲0,不然 z 對應bit位等於 x 中相應的bit位的值。不知道你們發現沒有,咱們還能夠這樣理解或操做符|,表達式z = x | y,若是 y 中的bit位爲1,則 z 對應bit位爲1,不然 z 對應bit位等於 x 中相應的bit位的值,與&^徹底相反。cdn

var x uint8 = 214
var y uint8 = 92
fmt.Printf("x: %08b\n",x)
fmt.Printf("y: %08b\n",y)
fmt.Printf("x|y: %08b\n",x | y)
fmt.Printf("x&^y: %08b\n",x &^ y)
複製代碼

輸出:blog

x: 11010110
y: 01011100
x|y: 11011110
x&^y: 10000010
複製代碼

移位運算符x<<nx>>n,若是左邊的操做數是有符號整型,則是算術移位;若是左邊的操做數是無符號整型,則是邏輯移位。邏輯移位不用考慮符號位,而算術移位須要考慮符號位,這樣能保證移位操做乘除的操做一致。對於x<<1,至關於x*2x>>1,至關於x/2;左移算術移位結果會向下取整:rem

var a int8 = -51
fmt.Println("a:")
fmt.Printf("%08b\n",a)
fmt.Printf("%d: %08b\n", a>>1, a>>1)

var b int8 = 51
fmt.Println("b:")
fmt.Printf("%08b\n",b)
fmt.Printf("%d: %08b\n", b>>1, b>>1)

var i uint8 = 1
fmt.Println("i:")
fmt.Printf("%d: %08b\n", i<<1, i<<1) //2: 00000010
fmt.Printf("%d: %08b\n", i<<7, i<<7) //128: 10000000
fmt.Printf("%d: %b\n", i<<8, i<<8) //0: 0
var i2 int8 = 1
fmt.Println("i2:")
fmt.Printf("%d: %08b\n", i2<<1, i2<<1) //2: 00000010
fmt.Printf("%d: %08b\n", i2<<7, i2<<7) //-128: -10000000
fmt.Printf("%d: %b\n", i2<<8, i2<<8) //0: 0
var i3 int8 = -1
fmt.Println("i3:")
fmt.Printf("%d: %08b\n", -i3<<1, -i3<<1) //2: 00000010
fmt.Printf("%d: %08b\n", -i3<<7, -i3<<7) //-128: -10000000
fmt.Printf("%d: %b\n", -i3<<8, -i3<<8) //0: 0
var i4 int8 = -128
fmt.Println("i4:")
fmt.Printf("%d: %08b\n", -i4>>0, -i4>>0) //-128: -10000000
fmt.Printf("%d: %08b\n", -i4>>1, -i4>>1) //-64: -1000000
fmt.Printf("%d: %b\n", -i4>>2, -i4>>2) //-32: -100000
複製代碼

輸出:字符串

a:
-0110011
-26: -0011010
b:
00110011
25: 00011001
i:
2: 00000010
128: 10000000
0: 0
i2:
2: 00000010
-128: -10000000
0: 0
i3:
2: 00000010
-128: -10000000
0: 0
i4:
-128: -10000000
-64: -1000000
-32: -100000
複製代碼

字符串鏈接可使用++=運算符:get

c := " Seekload"
s := "Hi" + string(c)
s += ", good bye"
複製代碼

整型溢出: 有符號整數的+-*<<的操做的結果的溢出不會致使異常,但結果可能不是你想要的,好比x < x+1並不老是成立,好比:

var x int8 = 127;
fmt.Printf("%d\n",x+2)   //輸出 -127
複製代碼

無符號整數的+、-、*、<<的操做的結果會取模2^n, 也就是溢出的位會被丟掉, 好比:

var x uint8 = 255;
fmt.Printf("%d\n",x+2)    // 輸出:1
複製代碼

比較運算符

兩個相同的整數類型可使用下面的二元比較運算符進行比較,比較表達式的結果是布爾類型。

布爾型、數字類型和字符串等基本類型都是可比較的,一些基本的比較操做我就不在這列舉了,你們能夠實操下,等你們學到後面,我會開一個篇文章詳解比較運算符。

邏輯運算符

符號  說明
&&   邏輯與  (p && q)  p、q全爲true,(p && q)才爲true
||   邏輯或  (p || q)  p、q至少一個爲true,(p || q)就爲true
!   邏輯非   !p  若p爲true,則!p爲false;若p爲false,則!p爲true;
複製代碼

運算符優先級

一元運算符有最高的優先級。操做符++--只能構成語句,而不是表達式,由於它們不屬於運算符序列。 下面是關於算術運算、邏輯運算和比較運算的二元運算符,按照優先級遞減的順序排列:

優先級   操做符
  5     *  /  %  <<  >>  &  &^
  4     +  -  |  ^
  3     ==  !=  <  <=  >  >=    
  2     &&
  1     ||
複製代碼

從上面能夠看出,二元運算符有五種優先級。在同一個優先級,使用左優先結合規則,可是使用括號能夠明確優先順序,使用括號也能夠用於提高優先級,例如:mask & (1 << 28)


(全文完)

原創文章,若需轉載請註明出處!
歡迎掃碼關注公衆號「Golang來啦」或者移步 seekload.net ,查看更多精彩文章。

公衆號「Golang來啦」給你準備了一份神祕學習大禮包,後臺回覆【電子書】領取!

公衆號二維碼
相關文章
相關標籤/搜索