一直以来对于逻辑与(&&)和按位与(&)的区别不是很确定。今天上网找了一下,然后也写代码验证了一下,现将其区别整理如下,供大家一起探讨。
- 操作数都为数字时
a. 对于两个数字进行按位与(&),会将两数字转换为二进制,然后右对齐后(不足位补零),相应位做与操作,如11&3,11的二进制表示是1011,3的二进制表示是11,右对齐后做与操作后,如图所示:
得到的结果是3。
b. 对于两个数字进行逻辑与(&&),会将两个操作数都转换成Boolean逻辑值(不为0的数字则为true,否则为false),然后再做与操作。
演示代码如下:
static void Main()
{
int i = 11; ///二进制是:1011
int j = 3; ///二进制是:0011
int num = i & j;
int num1 = Convert.ToInt32(Convert.ToBoolean(i) && Convert.ToBoolean(j));
Console.WriteLine("按位与结果:{0}", num);
Console.WriteLine("逻辑与结果:{0}", num1);
}
2. 操作数不为数字,为返回逻辑值的等式或方法
a. 对于按位与(&),会对所有的操作数进行判断。看一下演示代码:
static void Main()
{
if (3 == 5 & ReturnTrue())
{
Console.WriteLine("结果为真");
}
}
static bool ReturnTrue()
{
Console.WriteLine("执行ReturnTrue方法");
return true;
}
输出结果是:执行ReturnTrue方法
分析如下:等式3==5返回结果false,由输出结果我们知道,在得到等式3==5返回false的情况下,仍然执行了ReturnTrue()方法,输出结果“执行ReturnTrue方法”
b. 对于逻辑与(&&),会逐个判断操作数,当不符合时,后面的操作数将不再进行判断。看一下演示代码:
static void Main()
{
if (3 == 5 && ReturnTrue())
{
Console.WriteLine("结果为真");
}
}
static bool ReturnTrue()
{
Console.WriteLine("执行ReturnTrue方法");
return true;
}
这段代码不会输出任何结果。
分析如下:等式3==5返回结果false,由输出结果我们知道,在得到等式3==5返回false的情况下,ReturnTrue()方法并未执行。得到的结果是3。