java java逻辑运算符短路的顺序

比较运算符&逻辑运算符
3-1,比较运算符&逻辑运算符
1,比较运算符:&,&,==,!=,&=,&=
如果用==比较两个引用类型变量,比价的是内存地址。
比较运算符运算完的结果必须是true或false。
2,逻辑运算符
&(AND与)、|(OR或)、^(XOR异或)、!(NOT非)、&&(AND短路与)、||(OR短路或)
逻辑运算符用于连接两个boolean类型的表达式。
int x = 3;
system.out.println(x&2 & x&5);
打印结果时true,如果x=6,则结果时false。
另外的比较运算:instanceof,检查是否是类的对象。
例如:&Hello& instanceof String 是true。
3,异或:^
true ^ true = false
true ^ false = true
false ^ true = true
false ^ false = false
异或的运算规律:^符号的两边结果如果相同,结果是false,两边的结果不同,结果是true。
4,!!true = true
5,&&和&的区别:
&&和&运算结果时一样的,但是运算过程有点小区别。
&:无论左边的运算结果是什么,右边都参与运算;
&&:当左边为false时,右边不参与运算。
||和|的区别:
||和|运算结果时一样的,但是运算过程有点小区别。
|:无论左边的运算结果是什么,右边都参与运算。
||:当左边为true时,右边不参与运算。
3-3,位运算符
1,二进制位的运算:
&&(左移)、&&(右移)、&&&(无符号右移)、&(与运算)、|(或运算)、^(异或运算)、~(反码)。
2,十进制数的位运算是先将一个十进制数转换为二进制,再对二进制位进行位运算,再将得到的二进制转换为十进制。
例如:&运算,计算6&3
6的二进制是110,3的二进制是011.
所以:(1表示true,0表示false)
再将010转换为十进制,所以6&3=2。
|、^、~与&类似。
3,&运算的小规律。
两个数进行&运算,取两串二进制数中第一个&1&在较低位的那串,然后只取两串中1后面的位数运算即可,因为两边只要有一个为0,其结果就为0,不是二进制中的有效数字。
第二串的第一个1在较低位,所以两串中的数只计算这一位后面的即可,因为前面的三个0与任何数做&运算,都是0,0不是有效位。
4,规律:6^3=5
即:6^3^3=6
规律:一个数异或同一个数两次,结果还是这个数。
此规律可以用于。例如:将一个图片的底层二进制码异或3,此时这张图片已经不能看,若将这张图片的底层二进制码再异或3,这张图片又能正常使用。
5,~反码:二进制取反,即0变为1,1变为0。
3-4,位移运算符
左移几位其实就是该数乘以2的几次方。
3&&2=12, = 3*22
&&可以完成2的次幂运算。
2,右移:补位时,最高位是什么就用什么补。
右移几位其实就是该数据除以2的几次方。
3,&&&:无符号右移。数据进行右移时,高位出现的空位,无论原高位是什么,空位都用0补。
4,位运算练习:
对两个整数变量的值进行交换。
//(1)有第三方变量: &
int a = 3 , b = 5; &
sop(&a=&+a+&,b=&+b); &
//a=5,b=3 &
//(2)无第三方变量 &
int a = 3 , b = 5; &
sop(&a=&+a+&,b=&+b); &
//a=5,b=3 &
//这种方式不要用,如果两个整数的数值过大,会超出int范围,会强制转换,数据会变化。 &
(3)无第三方变量 &
//位运算法,一个数异或同一个数两次,结果还是这个数。 &
int a = 3 , b = 5; &
a = a ^ & //a = 3 ^ 5 &
b = a ^ & //b = (3 ^ 5) ^ 5; b = 3 &
a = a ^ & //a = (3 ^ 5) ^ 3; a = 5 &
sop(&a=&+a+&,b=&+b); &
//a=5,b=3 &
//一般都用第一种方式,因为性强。 &
3-5,三元运算符
格式: (条件表达式)?表达式1:表达式2;
如果条件表达式结果为true,则返回表达式1的结果,否则返回表达式2的结果。
int x=0,y; &
y = (x & 1)?100:200; &
结果:y=200;
例:获得三个整数中较大的整数。
int o,p,q; &
itn temp = o&p?o:p; &
int max = temp&q?temp:q; &
sop(&max=&+max); &
3-6,语句&&if格式
int a=3,b; &
& & b=100; &
& & b=200; &
sop(&b=&+b); &
虽然b没有被初始化,但if语句都要执行,可以输出b的结果。
b = a&1?100:200; //三元运算符就是if else语句的简写形式。 &
b = a&1?sop(100):sop(200); &//这个式子中,b没有赋值,三元运算符是运算符,必须有一个运算结果,而if else语句可以没有运算结果。&JAVA 逻辑运算符的运算顺序的误解 -
- ITeye博客
博客分类:
先看下运算的代码:
boolean test3=true||true&&
boolean test5=false&&true||true
System.out.println("test3="+test3);
System.out.println("test5="+test5);
是谁像我一样把 test3 算成 false的?
结果:
test3=true
test5=true
下面来解释下:
大家都知道短路的说法吧。
1.逻辑与(&&),如果第一个操作数为false,那么结果肯定false,所以在这种情况下,将不会执行逻辑与后面的运算了,即发生了短路。
2.逻辑或(||),如果第一个操作数为ture,那么结果肯定是ture,所以在这种情况下,将不会执行逻辑与后面的运算了,即发生了短路。
关于短路注意:
一旦能够明确无误地确定整个表达式的值,就不会再计算表达式剩余的部分了。注意一定要是明确无误地确定整个表达式的值才会短路。
像上面的情况:既有&&又有||这个时候就不会短路,而是按照优先级进行运算。&&是先于||所以&&的先运算,而局部运算也会走短路逻辑。
例如:
boolean test2=false&&5/0&0||(结果为:test2=false)
5除以0 ,明显被除数为0会报错,而此时运行确没有报错,就是因为逻辑与短路。
而反过来
boolean test2=true&&5/0&0||
就会报被除数为0错误。
总结:
逻辑运算符运算是,如果明确无误地确定整个表达式的值,就会走“短路”逻辑,而如果比较复杂的话就会按照优先级进行运算,而局部运算也会用到短路逻辑。
运算符优先级参考:
http://blog.csdn.net/xiaoli_feng/article/details/4567184
浏览: 10177 次
来自: 北京JAVA绉讳綅杩愮畻绗

我要回帖

更多关于 java中逻辑运算符 的文章

 

随机推荐