JAVA中&&和&、||和|的区别?「建议收藏」

JAVA中&&和&、||和|的区别?「建议收藏」问题一:JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别?首先名称是不同的&&逻辑与  ||逻辑或  它们都是逻辑运算符& 按位与  | 按位或  它们都是位运算符if(a==1&&b==2) 这是说既要满足a=1也要满足b=2if(a==1||b==2) 这是说或者满足a=1或者要满足b=2而a&b或者a|b则是二进制的与…

大家好,又见面了,我是你们的朋友全栈君。

问题一:

JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别?

首先名称是不同的

&&逻辑与  ||逻辑或  它们都是逻辑运算符

& 按位与  | 按位或  它们都是位运算符

if(a==1&&b==2) 这是说既要满足a=1也要满足b=2

if(a==1||b==2) 这是说或者满足a=1或者要满足b=2

而a&b或者a|b则是二进制的与或运算

&同为1时为1,否则为0

|同为0时为0,否则为1

3&5则

 0011

&0101

 0001

等于1

3|5则

 0011

|0101

 0111

等于7

&&逻辑与 也叫做短路与 因为只要当前项为假,它就不往后判断了,直接认为表达式为假

||逻辑或 也叫做短路或 因为只要当前项为真,它也不往后判断了,直接认为表达式为真

 

问题二:
关于Java 中逻辑运算与位运算的区别(具体到解一道题)
题目出自Java2实用教程(第三版)(却没有解释)

程序如下图:

JAVA中&&和&、||和|的区别?「建议收藏」

运行结果如下:

JAVA中&&和&、||和|的区别?「建议收藏」

为什么? x,y,a,b 不是都在IF语句里都重新赋值了吗?按道理全为真了,y也该是20了吧?(用程序验证过了,的确是这个结果)

回答:

逻辑运算符执行的是短路求值
       所谓短路,就是当参与运算的一个操作数已经足以推断出这个表达式的值的时候,另外一个操作数(有可能是表达式)就不会 执行

比如:
static boolean f1() { System.out.println( “function f1 called.” ); return true; }
static boolean f2() { System.out.println( “function f2 called.” ); return false; }
if ( false && f1() ) {} // f1不会被调用
if ( true || f2() ){} // f2不会被调用

由于&& 要求它的参与操作的两个操作数都是布尔值真,才得真,所以只要得出其中一个为假,那么另一部分的表达式就不会被求值(在上面的例子中是f1()不会被调 用)
同理由于||要求它的参与操作的两个操作数只要其中之一为真,就得真,所以只要得出其中一个为真,那么另一部分也不会被求值(在上面的例子中 是f2()不会被调用)

这就是逻辑操作符所谓的“短路求值” 

位操作没有这一特性,所以不管那边的值是如 何,任何参与运算的表达式都会被执行求值,因此也就产生了你代码之中的结果了。

 

三、Java中逻辑运算短路的理解:

短路” 主要用于逻辑运算符中,即 “ !   && || “这三种运算符
短路 就是知如果左侧的表达式能确定运算后的结果,则不再计算右侧的表达式。
如(1>2)&&(2<3) 明明左侧已经为假 了,我 不用计算右侧我一定知道 此表达是为假,这样 就好似物理中的电流,当某处短路时,电流直接从一条路通过,而不再管另一条路。

看个例子:

public class Logic{

    public static void main(String[] args){

          int a = 1;
          int b = 1;
          if(a<b&&b<a++){

          System.out.println(a>b&true);
          System.out.println(a);
          System.out.println(“this’s in my control”);
          }
          else{

          System.out.println(“that’s impossible”);
          System.out.println(a);
          }

     }
}

此处由于a<b为假 ,所以 后面的b<a++不会执行
此处的结果为 
that’s impossible
1
若假设a的初值为0,此时a<b成立,这时就要计算后面的值了
结果应该为和上面一样。

网上看见有人对   && 与 & 有点混淆,顺便说说我的理解
本来 & 是个 位运算符
也就是主要用来 做二进制运算的,如 010101&101010 = 000000

但它的特别之处在于它可以 进行 boolean值的运算
就像我上面写的   a>b&true 

其实我想这追根究地 在于 boolean 在内存中是用一位二进制来表示的,故可以进行位运算
我们不能被表象所迷惑 ,认为这是逻辑运算 ,这样理解就根本不存在讨论短路的必要了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156813.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 敏感词过滤算法:前缀树算法

    敏感词过滤算法:前缀树算法背景平时我们在逛贴吧、牛客网的时候,我们经常可以看到一些形如“***”的符号,通过上下文,我们也可以很容易猜到这些词原来是骂人的话,只是被系统和谐了。那么这是如何实现的呢?作为普通人,我们最先想到的一种办法就是把所有敏感串存入一个列表中,然后用户每发一条内容后台就把该内容与敏感串列表的每一项进行匹配,然后把匹配的字符进行和谐。显然这样的效率是很低的。非常影响性能,那么我们有没有其他的算法…

    2022年6月6日
    40
  • (轉貼) 曾說退出政壇 謝長廷:是幽默啦!(News)

    (轉貼) 曾說退出政壇 謝長廷:是幽默啦!(News)(轉貼) 曾說退出政壇 謝長廷:是幽默啦!(News)

    2022年4月21日
    41
  • ios长按不能粘贴_ios14长按不能复制

    ios长按不能粘贴_ios14长按不能复制/*设置IOS页面长按不可复制粘贴,但是IOS上出现input、textarea不能输入,因此将使用-webkit-user-select:auto;*/*{-webkit-touch-callout:none;/*系统默认菜单被禁用*/-webkit-user-select:none;/*webkit浏览器*/-khtml-user-select:none;…

    2022年9月29日
    0
  • SSIS 实用表达式部分总结

    SSIS 实用表达式部分总结

    2021年11月26日
    69
  • Java视屏教程下载地址——孙鑫讲解

    Java视屏教程下载地址——孙鑫讲解CD1-2        CD3-4CD5-6CD7-8CD9-10JLesson7CD11-12光盘讲解:CD1:Java的一些基本概念,Java的起源、为什么我们要学习Java语言,Java跨平台原理剖析;Java环境变量的配置,初学者常犯的问题,Java语言的基本数据类型和Java的语句。CD2:Java面向对象编程,面向对象编程和面向过程

    2022年5月16日
    38
  • R语言绘制火山图_r语言画曲线图

    R语言绘制火山图_r语言画曲线图基因表达差异火山图提到差异火山图,相信很多同学肯定不陌生。因为形似火山(喷发),所以称为火山图。差异火山图最常见于转录组数据的分析中,在基因表达层面,用于展示两组间表达量上调和下调的基因。常规的火山图中主要包含了两个重要信息,差异表达倍数(FoldChange值,简称FC,作图时会对FC进行log转化,根据logFC值的正负判断这些基因的表达量是上调了还是下调了)以及统计学显著性p值(p-value,通常是FDR校正后的p值,根据校正后p值判断基因表达量上调或下调是否具有显著性)。因此在判..

    2022年10月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号