Java中的&与&&代表的是完全不同的两个概念,一个是逻辑运算,一个是条件运算,同时两者又都属于条件运算。
一、先看结论:
- 首先看运算符两边的数据类型:&&左右只能是布尔类型数据,&两边可以是布尔类型也可以是数值类型;
- 再来看运算符的运算规则:&&会出现短路现象,即左边表达式值为false时,整个表达式最后结果必为false,所以右边的表达式就不需要判断是true还是false了,&必须把左右表达式结果都运算出来,再根据与运算的规则确定表达式结果;
- 最后在看两者的具体运算方法:&&比较简单,直接就是真真为真,其余为假;&是要按位运算再确定表达式结果的,详细过程看下方解析。
二、&逻辑运算
先看按位运算定义:
程序中的所有数在计算机内存中都是以二进制的形式存储的,位运算就是直接对两个数的二进制表示形式进行比较运算;
说白了就是,把整数在内存中的二进制数据拿出来进行比较,比较的时候要上下对齐比较,得出的结果也是二进制数据,再转换成十进制数据显示,就是按位运算的最终结果。
举个例子:
6&11
- 第一步:十进制6的二进制表现形式是110;
- 第二步:十进制11的二进制表现形式是1011;
- 第三步:6&11就可以写成:110 and 1011;
为了直白显示出两个数据的前后比较,可以这样写:
110
1011
但此时很明显的是,一个三位数据,一个是四位数据,位数不对应的,要按照自右向左的原则排序,不足的数位用0代替;那此时就应该写成:
0110
1011
按位与运算的运算规则是:1代表true,0代表false;
因为与运算的规则就是两个数据同时为真,结果才为真;
那么6&11的运算结果为
0010
- 第四步:把0010 换算成十进制,就是最终结果2;
三、&&条件运算符
逻辑运算符就是逻辑上的运算,即运算符左右两个数据必须是Boolean类型的;
&&也是与运算,同样遵守与运算的运算规则:两个数据同时为真,结果才为true;
举个例子:
boolean a = false;
Boolean b - true;
if(a&&b){
//输出 结果为真
}else{
//输出 结果为假
}
那么此时程序就会走else不走if结构体,输出内容就是:结果为假;
因为逻辑运算符比较的就是左右两个数据的Boolean值,不需要进制之间的转换等操作。
四、总结
一个&是位运算,两个&&是逻辑运算;
一个要进制转换,两个不用太多操作;
一个要按位逻辑,两个直接前后逻辑。
可以这样记忆:位运算只有一个运算符,所以还有另一只手去做别的事,就需要进制转换再逻辑运算;逻辑运算两个运算符,左右手各拿一个,没有空余的手去做其他的事,就直接逻辑运算。