使用&和&&操作者

时间:2011-03-06 09:47:24

标签: language-agnostic operators

同样的问题是|和||。

&和&&运营商?我能想到的唯一用途是

使用&
逐步修改int基类型(但不是浮点数/小数) 返回bool的bools /函数的逻辑短路。使用&&通常是运营商

我无法想到我使用过它的任何其他情况 有谁知道其他用途?

-edit-澄清一下,我问的是任何语言。我看到DateTime使用' - '来返回一个时间跨度,字符串使用'+'来创建新的字符串等等。我不记得任何自定义数据类型使用&&和&amp ;.所以我想问他们(合理地)可以使用什么?我不知道一个例子。

6 个答案:

答案 0 :(得分:2)

在大多数基于C语言中,这些运算符的含义是:

  • && - 布尔AND。用于布尔表达式,例如if语句。
  • || - 布尔OR。用于布尔表达式,例如if语句。
  • & - 按位AND。用于AND两个操作数的位。
  • | - 按位OR。用于OR两个操作数的位。

然而,这些 保证不是这样。由于每种语言都定义了自己的运算符,因此可以将这些字符串定义为不同语言的任何语言。

从您的编辑中,您似乎正在使用C#。以上描述适用于C#,|&也是条件运算符(取决于上下文)。

至于您对DateTime+运算符所说的内容 - 这与您提及的其他运算符及其含义无关。

答案 1 :(得分:1)

由于你关于这些运算符的previoes问题是关于C#,我认为这个也是。

通常,您希望使用条件运算符的短路版本来避免不必要的操作。如果第一个操作数的值足以确定结果,则不需要评估第二个操作数。

当条件依赖于previos条件为真时,只有短路运算符工作,例如进行空检查和属性比较:

if (myObj != null && myObj.State == "active")

在这种情况下使用&运算符不会使第二个操作数不被评估,并且会导致空引用异常。

如果希望两个操作数始终被评估,例如当它们有副作用时,非短路操作符很有用:

if (DoSomeWork() & DoOtherWork())

如果第一个方法返回false,则使用&&运算符将阻止调用第二个方法。

&|也是二元运算符,但由于||&&运算符不是,因此当您使用它们时不会有歧义二元运算符。

答案 2 :(得分:1)

如果您询问所有语言,那么我认为谈论“&运算符”是不合理的。令牌&可能具有不同语言的各种含义,运算符和其他语言。

例如,在C中,有两个不同的&运算符(一元地址和二进制按位和)。 C和相关语言中的一元&是我能立即想到的唯一一个例子,我遇到的符合您标准的用法。

但是,C ++添加了运算符重载,因此它们对于用户定义的类可能意味着什么,此外&字符在类型声明中具有意义。在C ++ 0x中,&&标记在类型声明中也有意义。

APL或J的语言可以“合理地”使用&运算符来表示几乎所有内容,因为不期望这些语言中的代码与C语言完全相似。不确定这两者中的任何一个是否确实使用&&&

对于C ++中的二进制&运算符重载而言,“合理”的含义是一个品味问题 - 通常它会以某种方式与按位&类似,因为值由您的类表示可以在某种程度上被视为一系列位。但是,不必是,只要它是在域中有意义的东西。通常,使用&重载是相当“不合理的”,因为&恰好未被使用。但是如果你的类在数学中表现出相当深奥的东西,并且在+*之后需要第三个二元运算符,我想你会开始环顾四周。如果你想要的是优先级比+更低的东西,那么二元&就是候选者。我暂时不能想到抽象代数中需要这样的东西的任何结构,但这并不意味着没有任何结构。

在C ++中重载operator&&是适度反社会的,因为运算符短路和重载版本的未重载版本没有。 C ++程序员习惯于编写像if (p && *p != 0)这样的表达式,所以通过重载operator&&,你实际上正在搞乱控制结构。

在C ++中重载一元operator&是非常反社会的。它阻止人们指向你的对象。 IIRC有一些尴尬的案例,标准模板的常见实现需要他们的模板参数,一元operator&会产生一个指针(或者至少是一个类似指针的东西)。这没有在参数的要求中记录,但是当库编写器实现模板时,几乎或完全不可避免。因此,重载将限制使用无法从标准中推导出的类,并且最好有一个很好的理由。

[编辑:当我写这篇文章时我不知道,但现在知道,模板编写者是否可以解决使用带有模板参数的一元operator&的需要,其中标准没有指定&为该类型做了什么(即所有这些)。您可以执行boost::addressof所做的事情,即:

reinterpret_cast<Foo*>(&reinterpret_cast<char&>(foo))

标准不需要reinterpet_cast,但由于我们讨论的是标准模板,因此他们确切地知道它在实现中的作用,无论如何将对象重新解释为chars是合法的。我认为这可以保证工作 - 但如果没有,实现可以确保它在必要时能够编写完全符合标准的模板。

但是,如果您的实现没有达到这些长度以避免调用重载operator&,那么原始问题仍然存在。]

答案 3 :(得分:0)

非常一般的问题,我假设您正在使用Java,C#或其他类似语法进行讨论。在VB中,它相当于字符串上的+,但这是我假设的另一个故事。

据我所知,如果您正在谈论C#,那么您的陈述是正确的。

答案 4 :(得分:0)

如果是Javascript,请查看以下答案:Using &&'s short-circuiting as an if statement?

在那里也有关于C#使用的简短讨论。

Java还有一些运算符,例如| =:What does "|=" mean in Java?

答案 5 :(得分:0)

C使用&amp;作为任何数据类型的一元运算符来获取数据的地址

例如:

int i = 5;
cout<<&i;//print the address of i

有些语言允许你覆盖这些操作符,让它们做任何你想做的事情!