1、逻辑运算符(部分)

符号

名称

&&

短路与运算符

||

短路或运算符

&

与运算符

|

或运算符

对于理工科学习者来说,逻辑运算是较为基础的概念,通常会在大一的离散数学课程中有所了解。在java以及更多c-like语言中,&和|会分别表示逻辑运算中的与、或,他们的运算结果与我们在数学书中所学的逻辑运算规则并无差异。但是,在实际编程的过程中,我们反而会更多使用&&和||,甚至不少同学都不了解&、|两个运算符。那么,这究竟是为什么呢?

2、短路运算符

让我们来回到最初学习逻辑运算时解决问题的真值表,以“或运算”为例:

a

b

结果

true

true

true

true

false

true

false

true

true

false

false

false

a和b中,只要至少有一个为true,最终输出的结果则为true。那么,从算法优化的角度来思考问题的话,我们为了经过最少步骤还能输出可靠的结果,我们便可以把“或运算”定义为,有一个true,就输出true。

由此,“或运算”可以被优化为:从左向右,遇到有一个布尔表达式为true,则返回true,不进行之后的运算。

与之相似的,“与运算”可以被优化为:从左向右,遇到有一个布尔表达式为false,则返回false,不进行之后的运算。

故此,短路运算符被设计了出来。但为了兼顾“执行命令并返回”、“纯粹的数学计算”等多种应用场景,传统的非短路逻辑运算符也没有被短路逻辑运算符而取代。

此外,对于连写的短路运算符,如func1()||func2()||func3()||func4(),编译器也会为此优化,我们不妨来阅读这一部分的字节码来验证这个结论:

public static void main(string[] args) {

boolean b1 = func1() || func2() || func3() || func4();

system.out.println("------------------");

boolean b2 = func1() | func2() | func3() | func4();

}

// func1() - func4() here

短路“或”的字节码如下:

0: invokestatic #7 // method func1:()z

3: ifne 24

6: invokestatic #13 // method func2:()z

9: ifne 24

12: invokestatic #16 // method func3:()z

15: ifne 24

18: invokestatic #19 // method func4:()z

21: ifeq 28

24: iconst_1

25: goto 29

28: iconst_0

29: istore_1

3行、9行、15行的ifne是将栈顶元素与0(false)相比,如果不为false则跳转到24行将常量1(true)入栈,完成赋值,会跳过其余的执行。直到最后21行,才将最后方法结果的值再与0相比,如果还是0,则将常量0入栈,完成赋值。

普通“或”等字节码如下:

38: invokestatic #7 // method func1:()z

41: invokestatic #13 // method func2:()z

44: ior

45: invokestatic #16 // method func3:()z

48: ior

49: invokestatic #19 // method func4:()z

52: ior

53: istore_2

则是普通的或运算,无跳转,顺序执行最后赋值。

3、应用与陷阱

在最起初,笔者重新认识短路运算符是在这样一段代码中:

public logincheckdto xxxlogincheck(string password) {

//some codes

if ( password == null || password.length() == 0 ) {

return logincheckdto.empty_password;

}

//some codes

}

当时笔者认为,如果password为null,在尝试调用password.length()时,会抛出空指针异常,故此写法不好。但在后来进行测试的时候,发现这样写并没有问题,查阅相关资料便了解了短路运算符的概念。

在这个例子中,当执行password == null返回true的时候,随后的表达式将不会被执行,就不存在抛出异常的情况了。这便是短路运算符较为常用的一个应用场景。

除此之外,我们还要警惕短路运算符导致的指令执行不完整。

譬如如下应用场景,我们希望利用条件语句来判断所有灯在上一状态是否都开着,并且无论如何我们希望最后打开所有的灯。但是我们错误使用了短路运算符:

public boolean checkandturnonall() {

return checkandturnon1() && checkandturnon2();

}

private boolean checkandturnon1() {

boolean check = check1();

turnon1();

return check;

}

private boolean checkandturnon2() {

boolean check = check2();

turnon2();

return check;

}

在这个场景中,如果第一盏灯在上一个状态是关闭状态,在checkandturnon1()中虽然会执行turnon1(),并且返回false,但由于短路特性checkandturnon2()并不会被执行,所以最后期望的看到所有的灯都被打开不一定会实现。这种情况应当使用&。

总结

到此这篇关于java中短路运算符与逻辑运算符的文章就介绍到这了,更多相关java短路运算符与逻辑运算符内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

java与与短路与_Java中短路运算符与逻辑运算符示例详解相关推荐

  1. java jdbc连接 代码块_java 中JDBC连接数据库代码和步骤详解及实例代码

    •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的 ...

  2. JAVA逻辑运算符示例详解:与、或、非、异或

    JAVA逻辑运算符示例详解:与.或.非.异或 对比表 与 逻辑与 短路与 或 逻辑或 短路或 非 逻辑非 异或 逻辑异或 对比表 与(仅左右语句都为真时为真)包括:逻辑与& 和 短路与& ...

  3. 站长在线python精讲:在Python中使用“+”运算符来拼接字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用"+"运算符来拼接字符串详解>.本知识点主要内容有:在Python中,我们可以使用& ...

  4. go语言字符串换行_Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(" ...

  5. python bisect_Python中bisect的用法及示例详解

    bisect是python内置模块,用于有序序列的插入和查找. 查找: bisect(array, item) 插入: insort(array,item) 查找 import bisect a = ...

  6. java break 在if 中使用_java中使用国密SM4算法详解

    前言 上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法.对称加密,密钥长度和分组长度均为128位. ps:我们既可 ...

  7. python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异

    每门编程语言在发布更新之后,主要版本之间都会发生很大的变化. 在本文中,Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异,以帮助说明语言的变化. 本 ...

  8. java for循环返回值_Java中的for循环——通过示例学习Java编程(9)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=21 循环用于反复执行同一组语句,直到满足特定条件为止 ...

  9. java int byte数组_Java 中int与byte数组转换详解

    1.与运算符的理解(&): 参加运算的两个数据,按二进位进行"与"运算.如果两个相应的二进位都为1,则该位的结果值为1,否则为0.即 0&0=0:0&1=0 ...

最新文章

  1. js等待5秒后执行_Python+selenium自动化之等待
  2. os项目icon和default 等相关图标命名规则和大小设置
  3. 主键可以增加查询速度吗_米脂起重信号工含金量高吗 可不可以联网查询在哪里查c...
  4. 监控路由器虚拟服务器,远程监控路由器虚拟服务器设置
  5. MySql创建一个存储过程
  6. 【Java】GoF-23种设计模式在Java核心类库中的应用
  7. 面试官问我:如何在 Python 中解析和修改 XML
  8. c# mysql 1062_C#中MySQL函数用DATASET 和 MySqlDataAdapter 操作数据库
  9. Java实现穷举_LeetCode 28:实现strStr() Implement strStr()
  10. 【opencv】错误提示OpenCV Error: Assertion failed
  11. mysql数据库增量_mysql数据库增量同步
  12. 注册.ocx控件时,提示“模块已加载,但对dllregisterserver的调用失败,错误代码为0x80040200 ”
  13. 大话存储系列19——数据容灾
  14. 这些年,我身边的那些人和事
  15. QT读取局域网共享文件夹文件内容 解决不同网段无法访问共享文件夹问题
  16. 单细胞论文记录(part19)--A comprehensive comparison on cell-type composition inference for ST data
  17. 天嵌TQ_E9卡片电脑移植飞思卡尔yocto L4.1.15_1.0.0_ga 第五篇 LCD+触摸屏移植
  18. MVP从入门到...
  19. 线程、多线程与线程池总结
  20. 内地朋友对香港银行开户的需求越发增多!

热门文章

  1. rate-limit
  2. 灯塔的出现给那些有想法,有能力而又缺乏资金的社区人士提供了一条途径,也给那些有资金的BCH爱好者提供了一条投资渠道,良性的共赢机制在保证平台健康发展的前提下,一定会催生出更多基于BCH的应用。
  3. 2019年5月12日-linux就该这么学-第6课
  4. 《linux c编程指南》学习手记5
  5. 调用webservice 的时候没法输入参数
  6. 区块链开发:为什么你应该学习?
  7. Mongodb WiredTiger存储引擎特性
  8. [Spring MVC] - Spring MVC环境搭建
  9. Cocos2d-x 创建自己定义项目模板
  10. Android 屏幕截图