byte op1 = 20;
sbyte op2 = 30;
var result = op1 & op2;
我知道&操作员返回bool,但我现在已经过去了。
为什么等于结果20? 为什么结果是Int32?
答案 0 :(得分:13)
我知道&运营商返回bool
当操作数也是bool时,这才是真的。 &
运算符是逻辑运算符或按位运算符,具体取决于其操作数。来自documentation:
Binary&运算符是为整数类型和bool预定义的。对于整体类型,&计算其操作数的逻辑按位AND。对于bool操作数,&计算其操作数的逻辑AND;也就是说,当且仅当两个操作数都为真时,结果才为真。
也许您正在考虑&&
运算符,它只是 逻辑运算符(在任何预定义类型上),并且还执行短路。
至于为什么结果为int
而不是byte
,sbyte
,short
或ushort
... 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);
请注意,这些函数没有short
或byte
个版本,这就是Int32
中结果的原因。
我认为这是这个问题的真正答案。
答案 2 :(得分:-1)
&如果两位中的任何一位为1,则按位运算符返回1,如果任何位为零,则返回0。在你的问题中像整数或字节的情况下,它在两个操作数之间执行AND的按位运算,因此结果将是整数类型而不是布尔值。 尝试使用&&因为它是逻辑运算符。