2016-09-28 52 views
1

我做的階位操作如下一些研究:斯卡拉位操作

scala> val b = 8 
b: Int = 8 

scala> var c:Int = b | (1<<4) 
c: Int = 24 

scala> var c:Int = c | (1<<5) 
c: Int = 32 

我不明白,爲什麼結果看起來是正確的,當分配值從B到C,但看起來不正確時,從C到本身。第三項聲明的預期結果爲56。任何人都知道爲什麼?

回答

2

在第三行中,您正在重新定義變量c。該REPL顯然工作在這樣一種方式,它首先建立了一個被設置爲默認值0的變量,然後它0 | (1 << 5)這是32

解決方法:不要重新定義變量c,只是將其重新分配:

scala> val b = 8 
b: Int = 8 

scala> var c: Int = b | (1 << 4) 
c: Int = 24 

scala> c = c | (1 << 5)  // Don't redefine c, just reassign it 
c: Int = 56 

在「真實」程序中(不在REPL中),不能在同一範圍內多次使用相同名稱定義相同的變量。如果您嘗試重新定義變量c,則會出現編譯器錯誤。

+0

非常感謝你Jesper! – Lionel

0

因爲您使用的是repl,所以您正在重寫變量c。所以上線

var c:Int = c | (1<<5) 

這是

var c:Int = 0 | (1<<5) 

的equivilant這是32如果你使用像d一個新的變量,那麼你獲得56如你所願。

+0

謝謝凱文! – Lionel