一直以來只知道“&&”是布爾與運算符,“||”是布爾或運算符,對之沒有具體的認識了解。對“&”和“|”的定義很模糊,所以特意上網搜里一下這方面的材料,特意在MSDN中查看一番,然后根據將MSDN中四種運算符整理一下,使自己深刻的了解他們含義和區別:
一,“&”和“&&”的含義和區別
1,“&”含義:
“&”運算符既可以作為一元運算符也可以作為二元運算符。
一元“&”:運算符返回操作數的地址(要求(unsafe)不安全上下文)。
為整型和 bool 類型預定義了二進制 & 運算符:對於整型,& 計算操作數的邏輯按位“與”,也就是對1/0的運算,當且僅當兩個操作數都為1時,結果才為1,其它都是0;對於 bool 操作數,& 計算操作數的邏輯“與”;也就是說,當且僅當兩個操作數均為 true 時,結果才為 true,其它的都是false。
& 運算符計算兩個運算符,與第一個操作數的值無關。 例如:
int i=0;
false&++i=1這個表達式是false,雖然++i=1是true;
二元“&”:用戶定義的類型可重載二元 & 運算符(重載內置運算符)。在枚舉時通常允許整型運算。 重載二元運算符時,也會隱式重載相應的賦值運算符(如果有)。
class BitwiseAnd { static void Main() { Console.WriteLine(true & false); // logical and Console.WriteLine(true & true); // logical and Console.WriteLine("0x{0:x}", 0xf8 & 0x3f); // bitwise and } } /* Output: False True 0x38 */
對於第三個按位“與”,如f(16)=1111(2)和3(16)=11(2),所以f(16)與3(16)為3(16),所以按位與運算的時候要結果是較小的值
2,“&&”含義:
條件“與”運算符 (&&) 執行其 bool 操作數的邏輯“與”運算,但僅在必要時才計算第二個操作數。
如表達式X&&Y和X&Y,如果X為false,Y為true。則第一個表達式只計算X,不計算Y,因為不論Y為何值,“與”操作的結果都是false。這種情況被稱作“斷路”計算。而第二個表達式都進行計算。
3,“&”和“&&”的區別
例子:
class LogicalAnd { static bool Method1() { Console.WriteLine("Method1 called"); return false; } static bool Method2() { Console.WriteLine("Method2 called"); return true; } static void Main() { Console.WriteLine("regular AND:"); Console.WriteLine("result is {0}", Method1() & Method2()); Console.WriteLine("short-circuit AND:"); Console.WriteLine("result is {0}", Method1() && Method2()); } } /* Output: regular AND: Method1 called Method2 called result is False short-circuit AND: Method1 called result is False */
由上面的例子我們可以清楚的看到。當使用“&”時,程序會將兩個操作數都進行計算后然后得出結果,而“&&”當第一個操作數是false的時候,就沒有必要進行計算第二個操作數,直接得出結果false。
二,“|”和“||”的含義和區別
1,“|”的含義:
| 運算符是為整型和 bool 預定義的。 對於整型, |計算操作數的按位“或”,就是對0/1,當且僅當兩個操作數中的一個為1,結果就是1。 對於 bool 操作數, | 計算操作數的邏輯“或”;也就是說,當且僅當兩個操作數均為 false 時,結果才為 false。
class OR
{
static void Main()
{
Console.WriteLine(true | false); // logical or
Console.WriteLine(false | false); // logical or
Console.WriteLine("0x{0:x}", 0xf8 | 0x3f); // bitwise or
}
}
/*
Output:
True
False
0xff
*/
和與運算,“|”按位或運算,應該結果應該選取較大的值。
2,“||”的含義:
條件“或”運算符 (||) 執行 bool 操作數的邏輯“或”運算,但僅在必要時才計算第二個操作數。
如表達式X||Y和X|Y,如果X為true,Y為false。則第一個表達式只計算X,不計算Y,因為不論Y為何值,“或”操作的結果都是true。這種情況被稱作“短路”計算。而第二個表達式都進行計算。
3,“|”和“||”的區別
例子:
class ConditionalOr { static bool Method1() { Console.WriteLine("Method1 called"); return true; } static bool Method2() { Console.WriteLine("Method2 called"); return false; } static void Main() { Console.WriteLine("regular OR:"); Console.WriteLine("result is {0}", Method1() | Method2()); Console.WriteLine("short-circuit OR:"); Console.WriteLine("result is {0}", Method1() || Method2()); } } /* Output: regular OR: Method1 called Method2 called result is True short-circuit OR: Method1 called result is True */
由上面的例子我們可以清楚的看到。當使用“|”時,程序會將兩個操作數都進行計算后然后得出結果,而“||”當第一個操作數是ture的時候,就沒有必要進行計算第二個操作數,直接得出結果ture。