一直以來對於邏輯與(&&)和按位與(&)的區別不是很確定。今天上網找了一下,然後也寫代碼驗證了一下,現將其區別整理如下,供大家一起探討。
- 運算元都為數字時
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。