为什么&运算符返回Int32而不是bool?

时间:2014-07-25 10:45:20

标签: c#

byte op1 = 20;
sbyte op2 = 30;
var result = op1 & op2;

我知道&操作员返回bool,但我现在已经过去了。

为什么等于结果20? 为什么结果是Int32?

3 个答案:

答案 0 :(得分:13)

  

我知道&运营商返回bool

当操作数也是bool时,这才是真的。 &运算符是逻辑运算符或按位运算符,具体取决于其操作数。来自documentation

  

Binary&运算符是为整数类型和bool预定义的。对于整体类型,&计算其操作数的逻辑按位AND。对于bool操作数,&计算其操作数的逻辑AND;也就是说,当且仅当两个操作数都为真时,结果才为真。

也许您正在考虑&&运算符,它只是 逻辑运算符(在任何预定义类型上),并且还执行短路。

至于为什么结果为int而不是bytesbyteshortushort ... C#没有定义算术/按位小于32位的运算符。这在another Stack Overflow question中讨论过,但并非特定于&

答案 1 :(得分:0)

令我惊讶的是,其他早期的答案错过了这个问题的有趣部分,这让我急于争取C#语言规范。

是的,&运算符是针对许多不同类型定义的。是的,如果两个参数都是bool,则它在评估两个参数后执行逻辑AND运算。也就是说,没有短路。效果是调用以下函数。

bool operator &(bool x, bool y);

但是如果参数是整数,它在评估两个参数并将它们转换为公共整数类型之后执行按位AND运算。效果是调用以下重载函数之一。

int operator &(int x, int y);
uint operator &(uint x, uint y);
long operator &(long x, long y);
ulong operator &(ulong x, ulong y);

请注意,这些函数没有shortbyte个版本,这就是Int32中结果的原因。

我认为这是这个问题的真正答案。

答案 2 :(得分:-1)

&如果两位中的任何一位为1,则按位运算符返回1,如果任何位为零,则返回0。在你的问题中像整数或字节的情况下,它在两个操作数之间执行AND的按位运算,因此结果将是整数类型而不是布尔值。 尝试使用&&因为它是逻辑运算符。