黑马程序员技术交流社区

标题: 逻辑运算符小疑惑 [打印本页]

作者: meng    时间: 2013-9-11 18:45
标题: 逻辑运算符小疑惑
本帖最后由 杨增坤 于 2013-9-13 08:51 编辑

    & 和 &&区别: & :无论左边结果是什么,右边都参与运算。
                      &&:短路与,如果左边为false,那么右边不参数与运算。
        | 和|| 区别:|:两边都运算。
                    ||:短路或,如果左边为true,那么右边不参与运算。
我的疑惑是:既然有两个的&&和||,要一个的还有什么用?


作者: 1098918523    时间: 2013-9-11 18:56
| : 会检查每一个 条件的真伪,再做“或”运算
||: 按照条件写的顺序,直到一个为true时,后面的条件则不再检查,直接进入条件
& : 会检查每一个 条件的真伪,再做“与”运算
&&: 按照条件写的顺序,直到一个为false时,后面的条件则不再检查,直接跳出
&是位运算符,表示按位与运算。&&是逻辑运算符,会短路。
作者: 李政    时间: 2013-9-11 19:01
本帖最后由 李政 于 2013-9-11 19:03 编辑

同意楼主的想法,似乎有了两个的,一个的就没有什么用了

作者: 垂天云    时间: 2013-9-11 19:02
本帖最后由 垂天云 于 2013-9-11 21:14 编辑

&,&&,都是逻辑运算符;
&表示与,左右两边表达式都要判定,全真才真;
&&表示短路与,如果左边不成立,那右边就不用判定,如果左边成立(true)再进行右边判定。

区别如下:
& 可以是位运算符,例如:27&3是二进制与运算,27的2进制是 11011 ,3的2进制是00011,与的话应该是 00011,换成十进制还是3。

&& 是逻辑与:a==b && c==d 这个是逻辑运算,结果只能是0 或 1。


| 是位运算的或,|| 是逻辑运算的或
a | b , 无论如何,都会计算 a 和 b
a || b, 只有当 a 为假的时候才会计算 b
区别:同上.      

  位运算示例:

   运算符  名称   示例    说明
    &       位与    x&y     把x和y按位求与
    |       位或    x|y     把x和y按位求或
    ~       位非    ~x      把x按位求非
    ^       位异或 x^y     把x和y按位求异或
    >>      右移    x>>y    把x的各位右移y位
    <<      左移    x<<y    把x的各位左移y位
    >>>     右移    x>>>y   把x的各位右移y位,左边填0


作者: kmter    时间: 2013-9-11 19:05
Nice! 以前我也同你有一样的疑惑, 但我觉得存在即合理(程序员恶习, 我们应该舍弃), 今儿就重新刨根问底吧. 在编程细节中我们就非常提倡使用&&和||, 甚至将其单独列出, 期待下面精彩的回复.
作者: EYE_SEE_YOU    时间: 2013-9-11 19:07
毕老师在视频中说过,有一种情况是短路可以成功运行,单个就运行失败
作者: 静以修身    时间: 2013-9-11 19:36
本帖最后由 静以修身 于 2013-9-11 19:39 编辑

百度了一下,&存在还是有点道理的:看你的需求而定,比如If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0) y不会增长,它们还是有区别的,用哪个看你的需求决定。双 个比单个的效率高,所以单个双个都能用的情况下一般选择用双个。
作者: meng    时间: 2013-9-11 19:57
1098918523 发表于 2013-9-11 18:56
| : 会检查每一个 条件的真伪,再做“或”运算
||: 按照条件写的顺序,直到一个为true时,后面的条件则不 ...

不错,很清晰
作者: meng    时间: 2013-9-11 20:02
静以修身 发表于 2013-9-11 19:36
百度了一下,&存在还是有点道理的:看你的需求而定,比如If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0) y ...

明白了         
作者: 张云飞    时间: 2013-9-11 20:08
存在肯定有其存在的道理!
这些功能上重复(其实这个不是重复)设计是为代码的效率和简洁存在的。
这个就好比for循环,有普通型for循环,有增强型for循环;要说使用,仅仅普通型的足以,而设计出增强型的主要就是某些情况下使用比较简洁且高效,比如在结合集合的使用中。
而这里的&、&&,|、||也是这种情况,如果只有一种也可以设计出程序,但是某些情况下就比较复杂了。比如楼上“静以修身”所举出的例子,如果需求是希望无论如何y都自增,那么使用&是不是简洁多了!!!
作者: meng    时间: 2013-9-11 20:09
垂天云 发表于 2013-9-11 19:02
&,&&,都是逻辑运算符;
&表示与,左右两边表达式都要判定,全真才真;
&&表示短路与,如果左边不成立,那 ...

你说的很详细,NS。
我的理解是:单个的在两种情况下用,1、当做位运算的时候,
2、当逻辑运算的时候不能短路操作的时候,比如下面的同学回答的例子:If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0) y不会增长,如果题目中需要增长,就必须用单个的。其他情况,一律用两个的。

&& 是逻辑与:10 && 11 这个是逻辑运算,结果只能是0 或 1。
结果是0和1的能举个例子么?

作者: meng    时间: 2013-9-11 20:12
EYE_SEE_YOU 发表于 2013-9-11 19:07
毕老师在视频中说过,有一种情况是短路可以成功运行,单个就运行失败

这个我倒是要去看看,在哪里?版主,现在这个回复总是要验证码,很恶心的。

作者: meng    时间: 2013-9-11 20:14
张云飞 发表于 2013-9-11 20:08
存在肯定有其存在的道理!
这些功能上重复(其实这个不是重复)设计是为代码的效率和简洁存在的。
这个就好 ...

表示同意!




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