首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Java和C#中逻辑运算符和按位运算符之间有区别?

为什么在Java和C#中逻辑运算符和按位运算符之间有区别?
EN

Stack Overflow用户
提问于 2013-01-02 04:59:19
回答 6查看 11K关注 0票数 9

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

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

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

(我知道您可以在布尔上下文中使用“按位”运算符来绕过Java和C#中的短路,但我从来不需要这样的行为,所以我猜这可能是一个很少使用的特例)

EN

回答 6

Stack Overflow用户

发布于 2013-01-02 05:06:44

1)在这些语言中同时使用逻辑运算符和按位运算符有什么具体原因吗?

是:

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

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

就C#而言,这根本不是真的。

例如,C#有两个布尔AND运算符:& (full)和&& (short),但它不允许对布尔值进行逐位运算。

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

票数 6
EN

Stack Overflow用户

发布于 2013-01-02 05:07:21

在C#中,使用布尔值

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

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

票数 3
EN

Stack Overflow用户

发布于 2014-04-28 02:21:22

回答晚了,但我会试着说出你真正想说的。

你是对的。要阐明您的观点,最简单的方法是提到其他类型化语言(如Visual Basic)具有既可作用于布尔表达式又可作用于整数表达式的逻辑运算符。

VB或operator: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++具有不同类型的逻辑运算符的另一个原因(除了短路)是允许任何非零数被重新解释为真,而零被重新解释为假。要做到这一点,他们需要运算符告诉他们以这种方式解释。Java拒绝整个重新解释的想法,如果你试图使用它的逻辑运算符来做这件事,它会抛出一个错误。如果不是短路评估,剩下的唯一原因就是他们希望操作员在做不同的事情时看起来不同。

所以,是的,如果Java和C#语言的设计者不关心这些,他们就可以为位逻辑和布尔逻辑使用一组逻辑运算符,并像其他一些语言一样,找出基于操作数类型来做什么。他们就是没有。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14114179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档