整理C#中“&”和“&&”、“|”和“||”的含義和區別


一直以來只知道“&&”是布爾與運算符,“||”是布爾或運算符,對之沒有具體的認識了解。對“&”和“|”的定義很模糊,所以特意上網搜里一下這方面的材料,特意在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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM