同样的问题是|和||。
&和&&运营商?我能想到的唯一用途是
使用&
逐步修改int基类型(但不是浮点数/小数)
返回bool的bools /函数的逻辑短路。使用&&通常是运营商
我无法想到我使用过它的任何其他情况 有谁知道其他用途?
-edit-澄清一下,我问的是任何语言。我看到DateTime使用' - '来返回一个时间跨度,字符串使用'+'来创建新的字符串等等。我不记得任何自定义数据类型使用&&和&amp ;.所以我想问他们(合理地)可以使用什么?我不知道一个例子。
答案 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
有些语言允许你覆盖这些操作符,让它们做任何你想做的事情!