黑马程序员技术交流社区

标题: 大家说说&和&&的区别 [打印本页]

作者: 黑马无敌    时间: 2015-6-25 20:17
标题: 大家说说&和&&的区别
关于这个问题,我就一直没搞懂,请大家解释一下。。。

作者: 刀叨    时间: 2015-6-25 20:17
&是一个位运算符,数据在内存里面都是按二进制存储的,所以有时候为了把数据按二进制输出,或者特定的计算某一位的时候才用这个,这个在针对硬件编程里面用的比较多,&&这个是一个逻辑关系运算符,两边可以是关系表达式,也可以是两个算术表达式,两边的结果同时为真(C语言里只要不为0就是真)的时候,结果为1,否则有一个为假则为假,且如果前面为假,后面的表达式将不再计算,例如:
  1. int a=2,b=3;
  2. int c= a>3&&(b++)>0;
复制代码
结果:c=0,a=2,b=3,因为a>3为假,所以逻辑表达式的值为0,赋值给c,并且后面的表达式不执行,b++不成立,所以b的值仍然为3.
作者: 黑马无敌    时间: 2015-6-25 20:20
主要讲讲用法区别,就是什么时候用&,什么时候用&&
作者: kime    时间: 2015-6-25 20:29
&&又称短路与,就是当该运算符前一个表达式为false时,就不再运算该运算符后面的表达式。比如表达式1&&表达式2,当表达式1的结果是false时,不再运算表达式2,直接返回false。而&两边的表达式都要运算。
作者: cemabenteng    时间: 2015-6-25 20:35
&是逻辑与、并且。有假则假
&&是短路与。 单从结果上看和&是一样的,例如if (x==1&x==2),如果前面x==1出现了false,后面也执行,
if (x==1&&x==2),如果前面x==1出现了false,后面x==2就不执行了。
作者: 黑马无敌    时间: 2015-6-25 20:45
cemabenteng 发表于 2015-6-25 20:35
&是逻辑与、并且。有假则假
&&是短路与。 单从结果上看和&是一样的,例如if (x==1&x==2),如果前面x==1出现 ...

谢谢了,我明白了
作者: 黑马无敌    时间: 2015-6-25 20:46
kime 发表于 2015-6-25 20:29
&&又称短路与,就是当该运算符前一个表达式为false时,就不再运算该运算符后面的表达式。比如表达式1&&表达 ...

我知道了
作者: αメ炫    时间: 2015-6-25 20:53
通常写两个&&,因为有短路情况会提高性能,在javascript中还可以利用&&的短路特性,能写出非常简洁的语句。ps:知道了要改为已解决的吧
作者: 刀叨    时间: 2015-6-25 21:16
黑马无敌 发表于 2015-6-25 20:45
谢谢了,我明白了

这个不对if(x==1&x==2);与if(x==1&&x==2);是不一样的,第一个判断的是(假如定义的x=1,且占1个字节),x==1为真,结果为1,x==2为假结果为0,再计算if(1&0)的值
  1.      0000 0001
  2. &  0000 0000
  3. -----------------
  4.     0000 0000
复制代码
为if(0);
后者if(1&&0);现在中间是关系运算,同真为真,有假必假,if(0);虽然看着结果相同,但是原理不同。
作者: Diors    时间: 2015-6-25 21:26
&&是逻辑判断,&&两端的表达式都成立则为true;&是位运算符,叫按位与,同一位上都是1,结果这个位才为1
作者: Diors    时间: 2015-6-25 21:28
Diors 发表于 2015-6-25 21:26
&&是逻辑判断,&&两端的表达式都成立则为true;&是位运算符,叫按位与,同一位上都是1,结果这个位才为1 ...

急需技术分,如果觉得正确有用,请采纳
作者: 1115302782    时间: 2015-6-25 22:03
&是位运算符,运用于整型的二进制位之间的运算,相应位同 为1,结果才为1;&&是逻辑运算符,是二目运算符,参与运算的两个量都为真,结果才为真,否则为假
作者: guohaichang    时间: 2015-6-25 22:04
数据在内存中是2进制形式存储的,&是按位与。
例如
7 在内存中是00000111,
15在内存中是00001111,
按位与就是上面这8位数据分别进行&&运算后再放在原位置,结果是00000111。

&&操作的是boolean数据true和false,在内存中表现就是 1 和 0 。
&&常用于条件判断语句中,如if、while、for、do……while
&常用于运算语句中,数值转化等。
作者: 林大涛    时间: 2015-6-25 22:23
已经有答案了,不用管我。
作者: lucien_he    时间: 2015-6-25 23:02
我来看看 具体 怎么讲
作者: 孙培广    时间: 2015-6-26 00:24

区别在于:& 前面的是否成立,&后面的也都要判断,而 && 则是:一但前面的不成立,后面的就不判断了。
举个例子:
int i =3
if(i > 4 & i = 5 ){
这个就会判断 i 是否大于 4,同时也会判断 i 是否等于5
};
而 && :
int i =3
if(i > 4 && i = 5){
这个就会判断 i 大于 4 是否成立,如果不成立,i = 5 就不执行了。
};
我也是刚学,如果写的不对,我们一起学正确的。
作者: threeforPP    时间: 2015-6-26 15:02
他俩结果是一样的,但是&&更高效,所以用的比较多&是逻辑与、并且。有假则假 &&是短路与。 单从结果上看和&是一样的,例如if (x==1&x==2),如果前面x==1出现了false,后面也执行,
作者: 德艺双馨    时间: 2015-6-26 19:48
&&是短路的,只要前面一个表达式为真后面的表达式就不会去执行,而&则是不管前面的表达式是否为真,后面的表达式都会要执行,所以说&&比&效率高,一般都用&&。但是有时候写程序就是想每次都执行后面的表达式,比如i++<0&j-->0中,我就想每次运算,不管i自加后是否小于0,j都要做自减,这时候就必须用&。此外&还有一个功能就是位的与运算,比如二进制01100100&10011101=00000100
作者: yyyyyyyyqs    时间: 2015-6-26 21:13
&和&&都是逻辑判断用的,

  &&如果表达式左边已经是false了,
    右边就不再计算了。

  &无论如何都要计算表达式的两边。
&&比&效率高点~

作者: 天涯回望    时间: 2015-6-26 21:21
好好看看老师的课堂总结吧
作者: cemabenteng    时间: 2015-6-26 21:22
黑马无敌 发表于 2015-6-25 20:45
谢谢了,我明白了

别客气,以后有事可以问我,虽然我会的不多,我可以给你问老师
作者: ch78842350    时间: 2015-6-26 22:28
& 和&&的区别在于,在布尔表达式中,一个&的俩边都要判断,而&&的,如果左边是假的,右边就不用看了
作者: Huan220_欢    时间: 2015-6-27 07:20
&和&&的区别:

单&时,左边无论真假,右边都进行运算;

双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算

作者: czf小耗子    时间: 2015-6-27 10:09
public class First{    public static void main(String[] args){    int i = 3;      if((i++>5)&(i++<9)){      System.out.println(i);       System.out.println("恭喜,执行完了条件语句");     }     System.out.println(i);   }  }
public class First{    public static void main(String[] args){
   int i = 3;      if((i++>5)& & (i++<9)){      System.out.println(i);       System.out.println("恭喜,执行完了条件语句");     }     System.out.println(i);   }  }
看看这两段代码会有什么区别
作者: jlnu_wl    时间: 2015-6-27 19:42
&和&&都可以用做逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false.
  &&还具有短路的功能,即如果第一个表达式为false,则不计算第二个表达式。
  例如:对于if(str!=null&&str.equals(""))表达式,当str为Null时,后面的表达式不会执行,所以不会出现NullPointerException,如果将&&改为&,则会抛出该异常。if(x==3 & ++y>0) y会增长,if(x==3 & &++y>0) y不会增长。
   &还可以作为运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0X0f来与一个整数进行&运算,来获取该整数的最低4个bit位。
    例如:0X31 &0x0f的结果为0x01
不知道你理解了没有,没有的话可以在问我,我尽量把我会的告诉你
作者: Ruby    时间: 2015-6-27 22:33
&&具有短路的功能 即如果第一个表达式为false 则不再计算第二个表达式
作者: fmi110    时间: 2015-6-28 09:07
学习一下
作者: 牵着蜗牛去逛街    时间: 2015-6-30 21:36
&和&&都可以用作逻辑与的运算符,表示逻辑与(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。
作者: 824519050    时间: 2015-7-9 21:05
     &和&&都可以用作逻辑与的运算符,表示逻辑与(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。


作者: qihuan    时间: 2015-7-13 22:39
刀叨 发表于 2015-6-25 20:17
&是一个位运算符,数据在内存里面都是按二进制存储的,所以有时候为了把数据按二进制输出,或者特定的计算 ...

赞!!!!!!
作者: fighting8    时间: 2015-7-25 23:51
&&为短路与,左边条件为false,右边条件不执行。
作者: BNU_harry    时间: 2015-10-24 12:07
一个是位运算符,一个是逻辑运算符.




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