黑马程序员技术交流社区

标题: 《哈尔滨校区》&&和&的区别 [打印本页]

作者: 小河北    时间: 2015-11-21 23:46
标题: 《哈尔滨校区》&&和&的区别
本帖最后由 小河北 于 2015-12-8 23:50 编辑

&&:短路与,有短路效应,前边出现false,后边不执行。
&:逻辑与,无论前边是false还是true,后边都会执行。
               
但他们的运行结果是一样的。希望此帖能够帮助像我一样的菜鸟们吧!类似的还有 | 和 ||
作者: nice非飞    时间: 2015-11-21 23:54
运行效果是一样的呀,就是为了提高所谓的效率,就那么一丁点的效率,根本感觉不出来的
作者: 隔壁马良    时间: 2015-11-22 00:43
nice非飞 发表于 2015-11-21 23:54
运行效果是一样的呀,就是为了提高所谓的效率,就那么一丁点的效率,根本感觉不出来的 ...

肯定是不一样的,你看一下这段程序
class Test {
        public static void main(String[] args) {
                int a = 5;
                int b = 6;
                int i = 5;
                int j = 6;
                if (a++ > 5 & b++ > 6)
                {
                        a = 8;
                        b = 10;
                }
                System.out.println("a = "+a+" , b = "+b);
                if (i++ > 5 && j++ > 6)
                {
                        i = 8;
                        j = 10;
                }
                System.out.println("i = "+i+" , j = "+j);
        }
       
}
输出结果是:
---------- java ----------
a = 6 , b = 7
i = 6 , j = 6
作者: @夏一    时间: 2015-11-22 00:50
隔壁马良 发表于 2015-11-22 00:43
肯定是不一样的,你看一下这段程序
class Test {
        public static void main(String[] args) {

很赞很赞,这个知识点老是记不牢,看了你的回答又学习了一遍。
作者: 隔壁马良    时间: 2015-11-22 01:03
@夏一 发表于 2015-11-22 00:50
很赞很赞,这个知识点老是记不牢,看了你的回答又学习了一遍。

这个主要是要看仔细,在&& 和||时一定要把前后分开看,前边为false时,后边的就一步也不执行,最好就不要看后边的了,影响结果
作者: @夏一    时间: 2015-11-22 01:11
隔壁马良 发表于 2015-11-22 01:03
这个主要是要看仔细,在&& 和||时一定要把前后分开看,前边为false时,后边的就一步也不执行,最好就不要 ...

是的是的,当时看视频时记住了,时间一长不用挺容易忘记的,幸好今天在论坛里面做了小题,要不然忘得更深了。
作者: nice非飞    时间: 2015-11-22 13:06
受教了,突然间感觉自己什么都忘了
作者: 萧未然    时间: 2015-11-22 14:46
&是位运算符,&&是逻辑运算符
作者: 小河北    时间: 2015-11-22 23:02
萧未然 发表于 2015-11-22 14:46
&是位运算符,&&是逻辑运算符

你说的欠佳,
     位运算符中包含    :  &、|,~、^、>>、>>>、<<;调用位运算符的都是数值型数据
    逻辑运算符中包含  :  &、|、!、^、&&、|、||、!;调用逻辑运算符的都是条件表达式(逻辑表达式两侧应该是boolean数据)
怎么区分位运算符中与逻辑运算符中相同的符号,是个难点
作者: 萧未然    时间: 2015-11-22 23:20
小河北 发表于 2015-11-22 23:02
你说的欠佳,
     位运算符中包含    :  &、|,~、^、>>、>>>、

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)
if(expression1 & expression2){}
中expression1 和expression2 无论expression1返回true还是false,都会继续判断expression2的返回值
if(expression1 && expression2){}
中如果expression1 返回false,那么expression2 不执行,跳出if语句,
   如果expression1 返回true,继续判断expression2
不管&作为逻辑运算符还是位运算符,其实它本身的意义并没有变,就好像,你自己,今天待在北京,明天待在上海一样,而且,数字中的0、1不刚好对应true、false么
作者: 小河北    时间: 2015-11-25 00:06
萧未然 发表于 2015-11-22 23:20
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)
if(expression1 & expression2){}
中ex ...

谢谢哥们!我再仔细研究一些
作者: 萧未然    时间: 2015-11-25 09:46
小河北 发表于 2015-11-25 00:06
谢谢哥们!我再仔细研究一些

{:2_36:}   
作者: 白羽蘇芳    时间: 2015-11-25 10:21
隔壁马良 发表于 2015-11-22 01:03
这个主要是要看仔细,在&& 和||时一定要把前后分开看,前边为false时,后边的就一步也不执行,最好就不要 ...

为啥if判断后,不会把8和10赋值给abij呢
作者: hdhunter    时间: 2015-11-25 10:34
学习了。
作者: 乌拉小黑    时间: 2015-11-25 11:48
不过还是复习了一下,差不多都忘了
作者: Myth、骞    时间: 2015-11-25 13:21
知识都是一点一点积攒的。。
作者: 隔壁马良    时间: 2015-11-25 23:19
白羽蘇芳 发表于 2015-11-25 10:21
为啥if判断后,不会把8和10赋值给abij呢

if (a++ > 5 & b++ > 6){....}中, a++ > 5    是  alse,  b++ > 6  也是false,因此()是false ,不再执行{}中的内容,但因为执行了 a++ > 5、 b++ > 6,a和b都会在逻辑运算结束后自加1,即最后输出时a = 6 , b = 7。
if (i++ > 5 && j++ > 6){ ... }中,&&是有短路功能,即左边为false的情况下就直接判定()为false了(&需要两边判定后才判定()),右边不再执行(同理 || 在左边为true时不再执行右边进行判断),因此在判断 i++>5为false后,i 会自加1,但右边的 j++ > 6 不执行,因此 j 还是保持原值


作者: oup    时间: 2015-11-25 23:33
好多大神出没
作者: 袁有福123    时间: 2015-11-25 23:47
很赞 这个东西记得不是很清楚 现在又复习巩固了下  
作者: 王开冰    时间: 2015-11-26 08:16
隔壁马良 发表于 2015-11-22 00:43
肯定是不一样的,你看一下这段程序
class Test {
        public static void main(String[] args) {

这个示例给力,理解了
作者: anuo    时间: 2015-11-26 09:27
&不管左边是true还是false,右边都要运算。&&反之,后面不运算。很多情况下,对结果没有影响。但在后期中,对于算法的优化是有一定作用的。|和||是一样的
作者: fsociety    时间: 2015-11-26 16:53
主要是节省资源,提升效率
作者: wyasln    时间: 2015-11-26 19:49
有些时候不一样,比如
if(2>4 & c<d++){};System.out.println(d);
if(2>4 && c<d++){};System.out.println(d);
这时候输出的d就不一样了,一个执行了d++,一个没有执行
作者: Phy_zhang    时间: 2015-11-26 20:36
&是位操作符,单符号。a&b 是a与b的运行 && 并且的意思,a==0&&b==0.




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