未分類

請問"|"與"&" 是邏輯運算子還是位元運算子?

Java 與 C 都有 | & 這個運算子符號,| & 是邏輯運算子還是位元運算子?

最近因為上了java初級的課被搞混了,答案先不說,如果你學 C 出身的話,你的答案將會是位元運算子,因為 | &  ^ ~ 應該是同一類的,所以它們都是位元運算子,針對每個位元做運算。

好,那又有另一種人可能是直接學Java,之前沒有其他程式背景,他就會說 | & 是邏輯運算子,因為 | & 是無捷徑的邏輯的運算,而|| &&是捷徑的邏輯運算,我上那堂課老師就真的是這樣教的。

先解釋一下捷徑運算是什麼意思,程式如果是這樣 (2>1) || (3>2),程式只要做到(2>1)是True的話,不管(3>2)結果是True或是false都不影響結果是Ture的結果,所以實際上程式習慣上是不執行(3>2)這段的,程式的捷徑運算在 C 本來就是這樣。

其實上面二個答案應該都是對的,| & 可以當邏輯運算子也可以當位元運算子,不過 | 和 & 拿來當邏輯運算子是比較怪,很少看到程式是這麼寫的
if ( years < 2000 years  > 2009 ){

Todo…

}

但是程式執行結果沒錯,因為 | 是位元運算子,左邊的years < 2000運算的結果是false要跟右邊的years > 2009 是false的結果做運算,false | false 結果是false,所以才為什麼說|兩邊都會做,所以沒有捷徑的問題。

但是我必須說對一個初學程式的人,直接教他|與||可以把它拿來當作非捷徑運算與捷徑運算的區別,實在不負責了,我覺得應該解釋 | 是位元運算子,但是只要它單單在做true跟false運算時剛好符合無捷徑的邏輯運算特性,所以把|拿來當作邏輯運算其實也是可以,我的意思是說其實|被當成邏輯運算在用是因為|在做位元運算時的 side effect 副作用出現的,所以怎麼可以反客為主呢?

也就是說 C 語言對 | & 運算子的切入點跟 Java 語言對| & 運算子的切入點方向有很大的不同,這應該是在於早期的 C 語言會以效能為主要考量,善用| 或 & 運算子會加快程式效能,但是程式難看難懂,那以目前的Java語言來說,程式好看好讀最重要,已經很少用到 | & 這種還要看到bit的位元運算子了,所以整本講義提到| & 就直接拿來跟 || && 做比較了,讓我這個先學 C 的人來說,真的怎麼看怎麼怪。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *