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

时间:2013-01-01 20:59:19

标签: c# java bitwise-operators logical-operators

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

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

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

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

6 个答案:

答案 0 :(得分:6)

  

1)是否有一些具体的理由在这些语言中同时使用逻辑和按位运算符?

是的:

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

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

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

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

答案 1 :(得分:3)

在C#中,使用布尔值

  • &安培;&安培;是一个短路的逻辑运算符
  • &安培;是一个非短路逻辑运算符

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

答案 2 :(得分:2)

我会说Java

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

答案 3 :(得分:2)

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


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

答案 4 :(得分:2)

迟到的答案,但我会尝试达到你的真实目的。

你是对的。最简单的方法是提到其他类型语言(如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#确实从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#语言设计者没有关心任何一个,他们可以使用一组逻辑运算符来进行按位和布尔逻辑,并根据操作数类型找出要做的事情。其他语言呢。他们只是没有。

答案 5 :(得分:1)

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

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

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

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