2013-01-01 102 views
8

像Java和C#這樣的語言既有按位又有邏輯運算符。爲什麼Java和C#中的邏輯運算符和按位運算符有區別?

邏輯運算符只對布爾操作數有意義,按位運算符也用於整數類型。由於C沒有布爾類型並將所有非零整數視爲true,所以邏輯運算符和位運算符的存在都是有意義的。但是,像Java或C#這樣的語言具有布爾類型,因此編譯器可以根據類型上下文自動使用正確類型的運算符。

那麼,在這些語言中同時使用邏輯運算符和按位運算符有一些具體的原因嗎?還是因爲熟悉的原因而被包含在內? (我知道你可以在布爾上下文中使用「按位」運算符來規避Java和C#中的短路,但是我從來不需要這樣的行爲,所以我想它可能是一個大部分未使用的特殊情況下)

+0

請參閱示例:http://stackoverflow.com/questions/11411907/what-are-the-cases-in-which-it-is-better-to-use-unconditional-and-instead-of – assylias

回答

2

我會說的Java

  • 邏輯運算符是用戶與布爾和位運算符與整數使用。他們不能混合。
  • 爲什麼不將它們減少爲一個運算符,如「&」或「|」? Java被設計爲對C/C++用戶友好,所以它得到了它們的語法。現在這些運營商不能因爲向後兼容而被縮減。
6

1)在這些語言中同時使用邏輯運算符和按位運算符有一些具體原因嗎?

是:

  • 我們必須布爾運算符做布爾邏輯(布爾值)。
  • 我們有按位運算符來完成按位邏輯(在整數值上)。

2)據我所知,您可以使用「按位」運營商在布爾上下文來規避Java和C#短路,

爲了儘可能C#去這根本不是真的。 C#有例如2個布爾AND運算符:&(full)和&&(short),但它不允許在布爾運算上按位運算。

因此,邏輯運算符和按位運算符之間確實沒有「重疊」或冗餘。這兩個不適用於相同的類型。

在C#
+1

也,C#中的運算符'^'(XOR)對於整數類型(例如'int'和'long')具有重載,它是一個**按位運算符,但對於bool而言,它具有一個重載, *邏輯**運算符。因此,當(至少在C#中)認爲符號是_not_ doubled(不是'&&','||')時,想法是錯誤的,那麼這是一個按位操作。這取決於使用哪個過載。由於某種原因,唯一符合位和邏輯的符號的運算符是否定符(分別是'〜i''!'b')。 –

3

,用布爾

  • & &是一個短路邏輯運算
  • &是一種非短路邏輯運算

按位,它只是使用&爲傳統的語法來自C/C++ ....但它確實完全不同。如果有的話,作爲一個完全不同的符號來避免任何困惑會更好。但是,並沒有真正的許多遺留,除非你想去尋找& & &或|||但那有點難看。

2

正如你已經說過,有&&&之間的一些差別(這同樣適用|||),所以你需要兩套布爾運算符。 現在,與上述無關,您可能需要按位運算符,最好的選擇是&,| s.o.因爲你不必避免任何混淆。


爲什麼要用兩個字符版本事情複雜化和?

+0

運算符是否短路與其執行按位計算有些正交的問題。可以定義一個短路位運算符和運算符來評估第一個參數,如果非零,則評估第二個參數並計算按位和參數(否則計算爲零)。 – supercat

1

編譯器不能推斷恰當的操作符僅查看參數。這是一個可供選擇的商業決定。這是關於懶惰的計算。例如

public boolean a() { 
    doStuffA(); 
    return false; 
} 

public boolean b() { 
    doStuffB(); 
    return true; 
} 

現在: a() & b()將執行doStuffB()a() && b()不會

+0

正如我在我的問題中所述,您描述的情況並不經常發生。另外我想很多查看代碼「a()&b()」的程序員可能會錯誤地認爲它是一個錯誤,並且爲&&操作符「糾正」它,所以先調用方法並使用邏輯&&爲原始程序員打算做的事提供更多的清晰度 – Askaga

2

晚的答案,但我會盡力去你的真實點。

你是對的。最簡單的方法是指出其他類型的語言(如Visual Basic)具有邏輯運算符,它們可以同時作用於布爾和整數表達式。

VB或運營商:http://msdn.microsoft.com/en-us/library/06s37a7f.aspx

VB按位例如:http://visualbasic.about.com/od/usingvbnet/a/bitops01_2.htm

這是一個很有語言的設計決策。 Java和C#不一定是他們的樣子。他們就是這樣。爲了熟悉起見,Java和C#確實繼承了C語言的大部分語法。其他語言沒有和工作得很好。

像這樣的設計決定有後果。短路評估是一個。不允許混合類型(這可能會讓人感到困惑)是另一回事。我喜歡它,但也許我只是一直盯着Java太久。

Visual Basic添加了AndAlso和OrElse作爲短路評估的一種方法。與基礎知識不同,其他邏輯運算符只適用於布爾值。

VB OrElse運算:http://msdn.microsoft.com/en-us/library/ea1sssb2.aspx

短路描述:http://support.microsoft.com/kb/817250

的區別沒有作出,因爲強類型使得不可能僅具有一種語言的一組邏輯運算符。這是因爲他們想要短路評估,他們想要一個清晰的方式向讀者發出發生了什麼事情的信號。

c和C++有不同種類的邏輯運算符的另一個原因是允許任何非零數字被重新解釋爲TRUE並且零重新解釋爲FALSE。要做到這一點,他們需要經營者告訴他們這樣解釋。Java拒絕整個重新解釋的想法,如果你試圖用它的邏輯運算符來做這件事,就會在你的臉上拋出一個錯誤。如果不是短路評估,留下的唯一原因僅僅是因爲他們希望操作員在做不同事情時看起來不同。所以是的,如果Java和C#語言設計者沒有關心他們可以使用一組邏輯運算符來進行按位邏輯和布爾邏輯,並且根據操作數類型來確定哪些要做,就像其他的一樣語言。他們沒有。