C# - |和&运营商?

时间:2012-01-08 07:17:01

标签: c# operators bitwise-operators logical-operators

编辑:我现在的主要问题是为什么这两个运营商需要重载以使用&&和||运营商。短路运营商不会采用对象的真值或假值并进行比较吗?在哪里使用&&和||运营商是|和&使用

我正在读C#,完整的参考资料,我对|很困惑和&运营商。我已经习惯了它们是比特运算符来比较两个整数的位,但是它们被解释为原始的逻辑运算符,并且&& amp;和||是短语版本,当语句肯定是某个值时,它会停止测试值。

这是否意味着两个运算符有多种用途,或者C#是否在幕后类型转换中做了一些操作?

此外,使用&&和||一个班级的运营商,为什么要这样做和&不得不超载?为什么不能只重载类的真值和假值?

2 个答案:

答案 0 :(得分:14)

|&运算符是整数上的按位运算和布尔运算符上的 eager logic 运算符。 ||&&运算符是布尔值上的惰性逻辑运算符。

  

此外,使用&&和||一个班级的运营商,为什么要这样做和&不得不超载?为什么不能只重载类的真值和假值?

你有一个Foo类,它有一个重载的true和false运算符。你希望Foo上的&&运算符取两个Foos并返回第三个。解释你打算如何只使用真假操作符。

  

为什么我们需要在C#中使用急切的布尔逻辑运算符?

如果您想评估两个布尔返回值的副作用并对它们应用逻辑运算。

  

我不明白,和&&和||运营商,我想要一个bool返回,而不是另一种类型。

然后你不需要重载任何东西。只需从Foo写一个隐式转换运算符到bool,你可以使用|,||,&和&&为了你的内心。

仅仅因为不想拥有&&或||返回除bool之外的其他东西的运算符并不意味着没有人这样做。假设你想要写一个三值逻辑运算符而不是Foo,其值可以是True,False或Nither。你可以定义&和|和&&和||运营商是真的,假的,都不是。显然你不希望运营商返回bool;你希望他们返回True,False或Nither。

  

我不明白的是什么和&运营商与&&&和||运算符。

他们完全相同的运营商。唯一的区别是,如果不这样做,懒惰的那些不会评估第二个操作数。

  

为什么必须|和&超载使用||和&&虽然?

请参阅上一个问题和答案。

  

|和&运营商需要两个操作数。

是的,他们这样做。 &&和&和||运算符。

答案 1 :(得分:0)

我没想到能够在网上找到答案,否则我不会在这里问,但我确实设法了,而且这就是我所拥有的:

来自http://msdn.microsoft.com/en-us/library/aa691312(v=vs.71).aspx它说:The operation x && y is evaluated as T.false(x) ? x : T.&(x, y)

换句话说,它评估x的真或假,如果x为假,则返回x,否则返回x & y。这可以解释为什么这两个|和&运营商需要为&&和和||,但它没有解释为什么它不被评估为:

T.false(x) ? x : T.false(y) ? y : x

如果有人能解释为什么y和x被比较,我将不胜感激。