黑马程序员技术交流社区

标题: 关于&和&&的问题! [打印本页]

作者: 黑马19我最牛    时间: 2013-3-20 20:30
标题: 关于&和&&的问题!
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println(3&2);
  6.         }
  7. }
复制代码
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println(3&&2);
  6.         }
  7. }
复制代码
为什么第一段代码能编译,第二段不能编译,
就是&和&&的问题,他们都是逻辑运算符啊!


作者: Alex shaw    时间: 2013-3-20 20:41
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑运算与(and).
比如说3&2 会将3和2变成2进制然后进行与运算
010
011
------
010
得出来的结果是010 转化成十进制就是2
而&&是逻辑运算符,只有&&左右两边的运算式都为true的时候,才会返回true
对于A&B,不管a是否为假,仍然要判断B。
对于A|B,不管a是否为真,仍然要判断B。
而对于A&&B,A||B在以上情况就不会去判断B了。因此&&也被称作短路与

作者: 刘辉    时间: 2013-3-20 20:43
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。这是它们通用的功能,但是&还可以作为位运算符,你这个题目中只能作为位运算符运算,逻辑运算符两边必须是boolean类型,当两边是整型数据的话,&是作为位运算符运算得出结果的.


作者: 我自信我很牛    时间: 2013-3-20 20:43
这个是因为&可以作为位运算符的,但是&&就不可以了,你的第一段代码输出结果是位运算的结果,第二段两边不是boolean型数,所以不能编译。
作者: 孙宁    时间: 2013-3-20 20:44
&不仅是逻辑运算符,还是位运算符,这里3&2是作为位运算符使用.&&只是逻辑运算符,逻辑运算符的结果都是布尔型的,3&&2很明显得不到布尔型的结果,如果改成true&&false就可以运行了
作者: 李阳阳    时间: 2013-3-20 20:46
本帖最后由 李阳阳 于 2013-3-20 20:53 编辑

&是位运算符,&&是逻辑运算符。而逻辑运算主要用于条件判断。
运算符&用于对两个数以二进制的形式,按位进行逻辑与运通常用于算;而运算符&&条件表达式中,
对两个或多个关系表达式进行逻辑与运算,并且运算符&&是短路运算符,也就是当&&之前的表达式
为false时,就不再对&&之后的表达式进行计算了,而是直接返回假值false。

例如:
整数 3 的二进制表示为:00000000 00000000 00000000 00000011
整数 6 的二进制表示为:00000000 00000000 00000000 00000110
按位与运算的结果为 2 :00000000 00000000 00000000 00000010
上下 对应位都为1时,结果为1,否则为零。
作者: lxww    时间: 2013-3-20 21:12
逻辑运算符是判断布尔类型,而位运算符可以操作int类型数据。你这个例子中,
&这个既是逻辑运算符,也是位运算符,而&&只是逻辑运算符,所以第一个有结果,第二个没结果。
作者: 黄诗宾    时间: 2013-3-20 22:30
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,
否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式

表达式1&&表达式2: 表达式1不成立,则表达式2不执行;
表达式1&表达式2:表达式1不成立,表达式2也执行




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