为什么Java和C#中的逻辑运算符和按位运算符有区别?

Java和C#等语言都有按位和逻辑运算符。

逻辑运算符仅对布尔操作数有意义,按位运算符也适用于整数类型。 由于C没有布尔类型并且将所有非零整数都视为真,因此逻辑和按位运算符的存在在那里是有意义的。 但是,Java或C#等语言具有布尔类型,因此编译器可以自动使用正确类型的运算符,具体取决于类型上下文。

那么,是否有一些具体的理由在这些语言中同时使用逻辑和按位运算符? 或者他们是否因熟悉原因而被包括在内?

(我知道你可以在布尔上下文中使用“按位”运算符来规避Java和C#中的短路,但我从来不需要这样的行为,所以我想这可能是一个大多未使用的特殊情况)

1)在这些语言中是否有一些具有逻辑和按位运算符的具体原因?

是:

  • 我们有布尔运算符来做布尔逻辑(在布尔值上)。
  • 我们有按位运算符来执行按位逻辑(在整数值上)。

2)我知道你可以在布尔上下文中使用“按位”运算符来规避Java和C#中的短路,

就C#而言,这根本不是真的。
C#有例如2个布尔AND运算符: & (full)和&& (short)但它不允许对布尔值进行按位运算。

因此,逻辑和按位运算符之间确实没有“重叠”或冗余。 这两个不适用于相同的类型。

在C#中,用布尔语

  • &&是一个短路逻辑运算符
  • &是一个非短路逻辑运算符

按位,它只使用&作为C / C ++的遗留语法….但它确实非常不同。 如果有的话,作为一个完全不同的符号会更好,以避免任何混乱。 但除了你想去&&&或

之外,还有很多事情要做 但那有点难看。

我会说Java

  • 逻辑运算符是具有布尔值的用户,并且按位运算符与整数一起使用。 他们不能混在一起。
  • 为什么不将它们减少到一个运算符,如“&”或“|”? Java被设计为对C / C ++用户友好,因此它获得了它们的语法。 如今,由于向后兼容性,这些运营商无法减少。

正如您已经说过的, &&&之间存在一些差异( |||也是如此)因此您需要两组布尔运算符。 现在,独立于上面的那些,你可能需要按位运算符,最好的选择是&| 所以既然你不必避免任何混淆。


为什么复杂化并使用双字符版本?

迟到的答案,但我会试着找到你真正的观点。

你是对的。 最简单的方法是提到其他类型语言(如Visual Basic)具有可以作用于布尔和整数表达式的逻辑运算符。

VB Or运算符: http : //msdn.microsoft.com/en-us/library/06s37a7f.aspx

VB Bitwise示例: http : //visualbasic.about.com/od/usingvbnet/a/bitops01_2.htm

这是一个非常语言设计的决定。 Java和C#不一定是这样的。 他们只是他们的方式。 为了熟悉,Java和C#确实从Cinheritance了大部分语法。 其他语言没有,工作得很好。

像这样的设计决定会产生影响。 短路评估就是其中之一。 不允许使用混合类型(这可能让人类感到困惑)。 我喜欢它,但也许我只是盯着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#语言设计者不关心任何一个,他们可以使用一组逻辑运算符用于按位和布尔逻辑,并根据其他语言的操作数类型找出要做的事情。 他们只是没有。

编译器无法推断出只查看参数的正确运算符。 这是一个可供选择的商业决策。 这是关于懒惰的计算。 例如

 public boolean a() { doStuffA(); return false; } public boolean b() { doStuffB(); return true; } 

现在: a() & b()将执行doStuffB()a() && b()则不会