9

像 ie Java 和 C# 这样的语言既有位运算符也有逻辑运算符。

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

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

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

4

6 回答 6

6

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

是的:

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

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

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

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

于 2013-01-01T21:06:43.947 回答
3

在 C# 中,带有布尔值

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

按位计算,它只是使用 & 作为 C / C++ 的遗留语法......但它真的完全不同。如果有的话,最好作为一个完全不同的符号来避免任何混淆。但是剩下的真的不多了,除非你想去 &&& 或 ||| 但这有点难看。

于 2013-01-01T21:07:21.083 回答
3

迟到的答案,但我会尽力了解你的真正观点。

你是对的。表达观点的最简单方法是提及其他类型语言(如 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# 语言设计者不关心这些,他们可以使用一组逻辑运算符来处理按位和布尔逻辑,并像其他一些语言一样根据操作数类型确定要做什么。他们只是没有。

于 2014-04-27T18:21:22.060 回答
2

我会说Java

  • 逻辑运算符是带有布尔值的用户,而位运算符则用于整数。它们不能混合。
  • 为什么不将它们简化为一个运算符,例如“&”或“|”?Java 被设计为对 C/C++ 用户友好,所以它有他们的语法。如今,由于向后兼容,这些运算符无法减少。
于 2013-01-01T21:05:56.360 回答
2

正如您已经说过的, and 之间存在一些区别&&&和 也是|如此||),因此您需要两组布尔运算符。现在,与上述情况无关,您可能需要按位运算符,最好的选择是&|因此您不必避免任何混淆。


为什么要把事情复杂化并使用两个字符的版本?

于 2013-01-01T21:07:32.223 回答
1

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

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

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

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

于 2013-01-01T21:13:02.770 回答