为什么,操作符返回Int32而不是bool
本文关键字:bool Int32 操作符 返回 为什么 | 更新日期: 2023-09-27 18:15:04
byte op1 = 20;
sbyte op2 = 30;
var result = op1 & op2;
我知道&操作符返回bool值,但是我现在搞混了。
为什么等于结果20?为什么结果是Int32?
我知道&操作符返回bool
只有当操作数也是bool类型时才成立。&
运算符可以是逻辑运算符,也可以是位运算符,取决于它的操作数。来自文档:
二进制,操作符是为整型和bool类型预定义的。对于整型,&计算其操作数的逻辑位与。对于bool操作数,&计算其操作数的逻辑与;也就是说,当且仅当两个操作数都为真时,结果为真。
也许您想到了&&
运算符,它只是一个逻辑运算符(在任何预定义类型上),并且还执行短路。
至于为什么结果是int
而不是byte
, sbyte
, short
或ushort
…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);
请注意,没有short
或byte
版本的这些函数,这就是为什么在Int32
的结果。
我认为这就是问题的真正答案。
如果两个位中的任何一位为1,则返回1;如果任何一位为0,则返回0。在整数或字节的情况下,就像你的问题,它执行与两个操作数之间的位运算,所以结果将是一个整数类型,而不是布尔。试着使用&&