写了代码近一段时间了,一直对与和或的判断模糊不清,可能是一直比较懒,没有用代码跑起过,建议用android studio跑一下对记住知识有很大的帮助,今天回顾一下,做下总结,
先看下这段代码的:
int i = 12;
int q = 11;
int w = 12;
int e = 13;
int r = 14;
int y = 10;
Log.e("msg",".............结果1"+(i != q && i!= w && i != e));
Log.e("msg",".............结果2"+(y != q && y!= w && y != e));
Log.e("msg",".............结果3"+(i != q || i!= w || i != e|| i != r));
Log.e("msg",".............结果4"+(y != q || y!= w || y != e || y != r));
Log.e("msg",".............结果5"+(i != w || y!= w || y != e || y != r));
Log.e("msg",".............结果6"+(i != w || y!= 10 || 13 != e || 14 != r));
if(i != q && i!= w && i != e){
Log.e("msg",".....上.....");
}else {
Log.e("msg","......下....");
}
if( i != w|| i != w||i != w ||i!= y ){
Log.e("msg",".....上.....");
}else {
Log.e("msg","......下....");
}
打印结果:
01-02 14:37:53.744 10265-10265/com.boerc.view E/msg: .............结果1false
01-02 14:37:53.752 10265-10265/com.boerc.view E/msg: .............结果2true
01-02 14:37:53.752 10265-10265/com.boerc.view E/msg: .............结果3true
01-02 14:37:53.756 10265-10265/com.boerc.view E/msg: .............结果4true
01-02 14:37:53.760 10265-10265/com.boerc.view E/msg: .............结果5true
01-02 14:37:53.760 10265-10265/com.boerc.view E/msg: .............结果6false
01-02 14:37:53.764 10265-10265/com.boerc.view E/msg: ......下....
01-02 14:37:53.764 10265-10265/com.boerc.view E/msg: .....上.....
总结:
1种情况,执行到i!=w返回false,因为是与,只要有一个结果为false都为false;
2种情况,执行到y!=q返回true,因为是与,只要结果为true就继续执行,一直到最后结果都为true,所以返回结果为true;
3种情况,执行到i!=q 返回结果为true,因为是或,就算后面!!=w 结果为false,但没有执行到,就算执行到了,结果依然为true,只要结果有一个为true,结果返回为true;
4种情况,同上
5种情况,同上
6种情况,执行到第一个结果为false,继续执行,结果都为false,最后返回false
& :不管怎么样左右两边都执行
&& : 当左边为真时会继续执行右边,直到执行到假为止,就停止执行
| :不管怎样左右两边都执行
|| : 当左边为假时会继续执行右边,直到执行到真时,就停止执行
规则:
&:只要两边有一个为false时,结果为false,全部为true时结果才是true
&& : 从左边开始,只要执行到false就停止执行,结果返回false,全部为true才是true,这种效率比单个&效率高,不用执行后面的判断
|:只要两边有一个为true时,结果都为true,全部为false时结果才是false
|| :从左边开始,只要执行到true就停止执行,结果返回true,全部为false时结果才是false,这种效率比单个||效率高,不用执行后面的判断。