&&和|| 不是逻辑运算符,而是条件运算符?


62

我对MSDN C#文档感到有些困惑,该文档指出&and |是逻辑运算符,而&&and ||是条件运算符。

我一直在打电话&&||并且是!逻辑运算符,所以我错了吗?


4
看起来确实不合逻辑,但是这两个类之间有一个重要的区别,而且至关重要的|||,即使在很多情况下它们都可以在程序行为没有明显变化的情况下进行互换,也不能假设可以与互换。
Daniel R Hicks

Answers:


120

我对MSDN C#文档感到有些困惑,该文档指出&and |是逻辑运算符,而&&and ||是条件运算符。我一直在打电话&&||并且是!逻辑运算符,所以我错了吗?

没有; 你是对的。

在MSDN文档中存在许多小的,几乎不重要的命名错误。我尝试了尽可能多的方法,但是在这种情况下并没有严重错误和误导的情况,这并不总是明智地利用时间。如果需要有关C#功能名称的明确声明,请转到规范。

因此:相关权限是C#规范,该规范在7.11节中规定:

&^|运算符称为逻辑运算符。

然后,它将进一步将内置逻辑运算符分解为整数,枚举,布尔值和可空布尔值逻辑运算符。还有用户定义的逻辑运算符。有关详细信息,请参见规格。

在7.12节中,我们有

&&||运营商被称为条件逻辑运算符。它们也称为“短路”逻辑运算符。

因此它们都是逻辑运算符。其中一些是条件逻辑运算符

是什么使条件逻辑运算符成为条件?可能有人会猜测是因为它们通常用于条件语句if)或条件表达式? :)中。真正的原因由规范给出:

&&||运营商的条件版本&|运营商:操作x && y对应的操作x & y,但y如果只计算x不假。该操作x || y与操作相对应x | y,除了y仅在x不为true时进行评估。

之所以命名条件逻辑运算符,是因为根据左手操作数的值有条件地评估了右手操作数。

通过注意到条件逻辑运算符只是条件表达式的 “语法糖”,我们可以更生动地看到这一点。 x && y只是一种更愉快的写作方式x ? y : falsex || y也是一种更加愉快的写作方法x ? true : y条件逻辑表达式实际上是条件表达式。

条件逻辑运算符还有用户定义的形式,这有点棘手。有关详细信息,请参见规范。

进一步阅读,如果您对这个主题感兴趣:


3
@RobertHarvey:是的,&可以对布尔,整数类型或枚举类型进行运算,而&&仅对布尔进行运算,这一事实与将运算符命名为操作符的“有条件”形式无关。条件运算符是条件运算符,因为它在其评估语义中具有条件分支。
埃里克·利珀特

16
我的印象是,在所描述的意义上,术语“短路运算符”比“条件运算符”更受欢迎(并且可能不那么模棱两可)。
布朗

15
@DocBrown:确实很受欢迎,但是我总是发现这个名字具有误导性;似乎有人认为“短路”和“捷径”是同一回事,这是有人提出的。短路是危险的故障,会迅速破坏电气系统。我们在C#中将“不安全”块命名为“不安全”,因为如果使用不正确它们将很危险;我们不要让事情变得可爱,而要误导那些载有大量价值的名称。甚至不让我开始使用Elvis操作员。:-)
Eric Lippert

26
@EricLippert:尽管“短路”听起来可能让公众感到恐惧,但我不认为K&R对实际定义感到困惑。在电气工程中,短路并非总是危险的故障,事实上,我们一直在故意这样做。这仅意味着通过给电流提供较短的路径来切断电路中不需要的部分。
hackerb9

1
@CortAmmon:您将要阅读以下段落,在该段落中,我指出用户定义的运算符语义略有不同,您应该查看规范以获取详细信息。
埃里克·利珀特

27

在C#中,这些都是 所有 逻辑运算符。

int x = 0xABCD & 0xFF // x == 0xCD

&&||称为“ 条件逻辑运算符”,因为它们会短路。

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

请注意,该术语因语言而异。在C和C ++中 &&||它们只是逻辑运算符。在Java中,&|被称为位运算符,而C和C ++并将其分类为算术运算符


3
是的,Microsoft是权威,但权威文件是规范。请参阅第7.12节,条件逻辑运算符
埃里克·利珀特

8
故事的寓意是:准确了解这些操作员的工作比精确地了解其姓名更为重要。
罗伯特·哈维

21
专注于操作员的操作,并不再沉迷于词汇表。另请参阅“ 命名为有害”
罗伯特·哈维

4
+1。问题中列出的所有内容只是带有一个或两个表达式并求值的运算符。形容词是不必要的头发分裂。
Blrfl


-2

关键是&|按位运算符,这意味着它们将应用于并产生位字符串值。在程序员中,按位是一个非常常用的术语。

例如0xff & 0x00 == 0x00,一会儿0xff | 0x00 == 0xff

&&||应用于条件,并得出条件的通常值;即truefalse

例如true && false == false,一会儿true || false == true

因此,&&||可以被称为有条件的经营者,即使不是程序员之间的通常用语。

当然,每个C,C ++,Java和C#程序员都知道这一切。但是我想这种误解的发生是因为“条件运算符”不是我们程序员经常使用的术语。


5
当然,每个C,C ++,Java和C#程序员都知道这一切。这是非常不礼貌的事情,这意味着OP很愚蠢。通过写给我们程序员一样,您排除了OP。请不要那样做。
DarkDust

1
我认为您的后续答案不会在埃里克·利珀特(Eric Lippert)接受的答案之后带来任何附加值,而且在不理解问题要点的意义上是不正确的。
Honza Zidek

@DarkDust每个C,C ++,Java和C#程序员都应了解这些运算符。这不是无礼,而是事实
Phil1970

1
@ Phil1970:OP似乎确实了解这些运算符,这是为了澄清命名。有鉴于此,在强调了希尔顿的答案中的相关术语之后,他的一句话可以解释为每个程序员都知道这些命名细节,但您却不知道。这错误的(在其他答案的讨论中可以看到),其措词是不礼貌的。
DarkDust

4
亲爱的所有人,如果我的回答看起来不礼貌,对不起。英语不是第一语言。无论如何,我绝不打算暗示OP不是程序员。我是说,他或她被阅读的文字中的一个不寻常的命名所迷惑。我要做的只是澄清程序片段的异常命名。
费尔南德斯希尔顿酒店
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.