黑马程序员技术交流社区

标题: 求高手给我详解一下&和&&的不同 [打印本页]

作者: 李杰    时间: 2012-8-28 10:32
标题: 求高手给我详解一下&和&&的不同
尤其是if(a>b & b>c)
和 if(a>b && b>c)的不同
作者: 追梦黑马    时间: 2012-8-28 10:37
if(a>b && b>c)是只判断左边的a>b就不判断了 左边为flase就是flase
作者: 王舜民    时间: 2012-8-28 10:38
&
false&true   false和true都需要判断真假,即使前面为假,后面还需要判断
false&&true 前面为假 后面就不需要判断,直接为假
第一示例:
int x = 1,y = 1;

if(x++==2 & ++y==2)//x++==2为假,但是任然执行++y
//所以y的值为2
{
        x =7;
}
System.out.println("x="+x+",y="+y);

-x=2,y=2
第二示例
int x = 1,y = 1;

if(x++==2 && ++y==2)//x++==2为假,直接不执行++y
//y结果为1
{
        x =7;
}
System.out.println("x="+x+",y="+y);

-x=2,y=1
作者: 追梦黑马    时间: 2012-8-28 10:40
&&是短路运算
比如
if(a>b && b>c)那么只判断第一个表达式a>b 是否的话,他就不会取判断后面那个表达式(b>c)
而&两个都会去判断!
这样&&的效率更高一些

同理可得| 和 ||区别  如如果左边表达式为ture  右边也不会判断
| 等同于 &
|| 等同于 &&
作者: 史龙贤    时间: 2012-8-28 10:40
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

     &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长

     &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
以上是张老师面试宝典上说的,我认为说的很好了。
作者: 孔德智    时间: 2012-8-28 11:05
(a>b && b>c) 换成数字表达更容易懂,比如 设a=1,b=0,c=2. (1>0&&0>2) 这个式子是逻辑真true
虽然右边的0>2是错的,但只要左边1>0是对的,整个式子就是true ,是逻辑短路现象
(a>b & b>c)
同样换成数字理解,(1>0&0>2)这个式子是逻辑假false,要是符号& 左右两边的式子同时成立才是true
作者: 张金    时间: 2012-8-28 11:18
解释的很详细啊,受教了。
作者: 王自强    时间: 2012-8-28 12:02
&和&&功能都是逻辑与连接符,为什么有两个?
可以这样记,因为&&比&多了一个&,所以&&功能更加强大了,多具备了一个短路的功能。
短路的意思就是说,在&&表达式中,如果判断左边的表达式为false,那么就执行了&&的短路功能,右边的表达式就短路了,右边的表达式就不用看了,程序也不读右边的表达式代码了,直接判断整个&&表达式结果为false。
而&没有短路功能,必须将两边的表达式都执行完,才给出整个表达式的结果。
在if(a>b & b>c)//&没有短路功能,所以两边都要执行到,先判断a>b再判断b>c,(不管右边的表达式是否影响结果,一定会读到右边的代码)
和 if(a>b && b>c)的不同//先判断a>b,如果为false,那么b>c就不读了。如果a>b为true再读右边的表达式b>c。
同理|和||区别也是这样。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2