为什么,操作符返回Int32而不是bool

本文关键字:bool Int32 操作符 返回 为什么 | 更新日期: 2023-09-27 18:15:04

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

我知道&操作符返回bool值,但是我现在搞混了。

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

为什么,操作符返回Int32而不是bool

我知道&操作符返回bool

只有当操作数也是bool类型时才成立。&运算符可以是逻辑运算符,也可以是位运算符,取决于它的操作数。来自文档:

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

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

至于为什么结果是int而不是byte, sbyte, shortushort…c#没有为小于32位的类型定义算术/位运算符。这是在另一个堆栈溢出问题中讨论的,但它不是特定于&

令我惊讶的是,之前的其他答案都错过了这个问题有趣的部分,这让我忙着找c#语言规范。

是的,&操作符是为许多不同的类型定义的。是的,如果两个参数都是bool,则在评估其两个参数后执行逻辑与操作。也就是说,没有短路。其效果是调用以下函数:

bool operator &(bool x, bool y);

但是如果实参是整数,则在计算两个实参并将它们转换为通用的整型后执行位与操作。其效果是调用下列重载函数之一:

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的结果。

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

如果两个位中的任何一位为1,则返回1;如果任何一位为0,则返回0。在整数或字节的情况下,就像你的问题,它执行与两个操作数之间的位运算,所以结果将是一个整数类型,而不是布尔。试着使用&&