昨天参加了一下午的code review会议,看到某些同事的代码中出现了逻辑运算与位运算混用的情况,觉得有必要针对这个问题进行说明
目录
1 & 与&&
&是位运算,在二元运算中输出的是位运算后的值
a = 0xff;
b = 0x03;
c = a & b;
上述计算中c = 0x03;其二进制计算过程如下
0xff ---> 1111 1111
0x03 ---> 0000 0011
计算结果为 0000 0011
如果是&&运算,那么输出的就是0/1,如:
a = 0xff;
b = 0x03;
c = a & b;
d = a && b;
d的结果为1,那么问题来了,如果在逻辑判断中,使用二者会有什么区别?
a = 0xff;
b = 0x03;
c = a & b;
d = a && b;
if (a & b)
{
DoSomething;
}
与
if (a && b)
{
DoSomething;
}
从语法和逻辑上,二者都不会出错,但是如果运算符左右不是数值而是表达式,问题就有了区别
if( (a < 1) & (b > 1)) //先计算a < 1的结果 0,然后计算b > 1的结果 1,最后对两个结果做与运算
{
DoSomething;
}
if( (a < 1) && (b > 1)) //此时由于a < 1为 0,if语句直接不成立,不再计算 b > 1的结果
{
DoSomething;
}
2 | 与 ||的区别
在逻辑语句中如果混用,语法和逻辑上没错误,运行时的区别与上述问题雷同,即:
if( (a > 1) | (b < 1)) //先计算a > 1的结果 1,然后计算b < 1的结果 0,最后对两个结果做或运算
{
DoSomething;
}
if( (a > 1) || (b < 1)) //此时由于a > 1结果为 1,if语句成立,不再计算 b < 1的结果
{
DoSomething;
}
3 对性能的影响
虽然从示例来看问题不大,但是在具体的使用环境中,会有天壤之别,考虑如下两种情景
(1) &与&&,| 与 || 两侧均为复杂表达式甚至某些接口调用,此时执行一侧和两侧全执行,效率相差很大,如果表达式右侧是需要硬件调用的,问题更大。
(2) &与&&,| 与 || 两侧表达式虽然简单,但是其外部有大循环的时候,对性能影响绝对不可忽略。
综上,二者的使用还是要严格区分的。