【转】整理C#中“&”和“&&”、“|”和“||”的含义和区别
【http://www.cnblogs.com/love-liu/archive/2011/12/28/2305305.html】
一直以来只知道“&&”是布尔与运算符,“||”是布尔或运算符,对之没有具体的认识了解。对“&”和“|”的定义很模糊,所以特意上网搜里一下这方面的材料,特意在MSDN中查看一番,然后根据将MSDN中四种运算符整理一下,使自己深刻的了解他们含义和区别:
一,“&”和“&&”的含义和区别
1,“&”含义:
“&”运算符既可以作为一元运算符也可以作为二元运算符。
一元“&”:运算符返回操作数的地址(要求(unsafe)不安全上下文)。
为整型和 bool 类型预定义了二进制 & 运算符:对于整型,& 计算操作数的逻辑按位“与”,也就是对1/0的运算,当且仅当两个操作数都为1时,结果才为1,其它都是0;对于 bool 操作数,& 计算操作数的逻辑“与”;也就是说,当且仅当两个操作数均为 true 时,结果才为 true,其它的都是false。
& 运算符计算两个运算符,与第一个操作数的值无关。 例如:
int i=0;
false&++i=1这个表达式是false,虽然++i=1是true;
二元“&”:用户定义的类型可重载二元 & 运算符(重载内置运算符)。在枚举时通常允许整型运算。 重载二元运算符时,也会隐式重载相应的赋值运算符(如果有)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 */ |
1 | 对于第三个按位“与”,如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,“&”和“&&”的区别
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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,“|”和“||”的区别
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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。