到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符、赋值运算符、逻辑运算符、关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术、逻辑、关系等运算,最后才进行赋值操作。也就是说,在这四类运算符当中,赋值运算符的优先级最低,那么其他三种运算符的优先级顺序又是如何排列的呢?
首先来看算术运算符,Java中的算术运算符主要包括正号负号、加减乘除,以及取余数符号。对于数学上的四则运算来说,大家早已熟知乘法和除法的优先级高于加法和减法,它们在Java编程中的优先级顺序也是如此,因为取余数运算依赖于除法操作,所以取余数运算跟乘除运算的优先级是一样的。另外还有正号和负号运算,其实主要是负号运算的优先级,数学上约定俗成负数可以直接参与四则运算,这意味着负号作为数字前面的减号,它的优先级比四则运算要高。于是算术运算符内部各符号的优先级顺序依次为:+正号、-负号 > 乘号*、除号/、取余数符号% > 加号+、减号-,下面是演示算术运算符优先级的代码例子:

		// 比较加减乘除以及取余数运算的优先级顺序
int fiveArithmetic = 7+5-4*6/3%9; // 等价于“7+5-(4*6/3%9)”
System.out.println("fiveArithmetic="+fiveArithmetic);
// 比较负号与乘除运算的优先级顺序
int negativeArithmetic = -8/4+2*-3; // 等价于“(-8)/4+2*(-3)”
System.out.println("negativeArithmetic="+negativeArithmetic);

再来看关系运算符,关系符号包括等号、不等号、大于号、小于号等等,它们互相之间的优先级是一样的。把关系运算符跟算术运算符作比较,按惯例应当是大于小于号不如加减乘除优先,Java代码里的关系运算优先级也确实低于算术运算。也就是说,某个式子要等到加减乘除计算完毕,接下来才会进行大于、等于和小于的关系比较。下面是比较算术运算符和关系运算符优先级的代码示例:

		// 以下比较算术运算符和关系运算符的优先级顺序
boolean greaterResult = 1+2>3+4; // 等价于“(1+2)>(3+4)”
System.out.println("greaterResult="+greaterResult);
boolean lessResult = 1+2<3+4; // 等价于“(1+2)<(3+4)”
System.out.println("lessResult="+lessResult);

接着看逻辑运算符,由于逻辑运算的与或非操作只对布尔变量进行,因此它跟操作数值变量的算术运算没有可比性,布尔类型与数值类型可是井水不犯河水,完全是风马牛不相及。故而逻辑运算只能与关系运算一较高下,因为关系运算的计算结果是布尔类型,同时逻辑运算的操作元素也为布尔类型,所以光凭感觉就可认为关系运算先于逻辑运算进行。这个推理的确适用于“与”、“或”、“异或”这三种逻辑运算,但并不适用于“非”运算,缘由在于“非”运算只有一个操作数。凡是只有一个操作数的运算符都归类为一元操作符,而一元操作符的优先级要高于二元操作符,是故负号运算比乘除运算优先,同理“非”运算也比大于等于小于要优先。但凡某变量前面出现了感叹号“!”,那么一定会先对该变量进行非运算,除非有个圆括号把感叹号后面的式子给圈起来。
于是逻辑运算最终的优先级顺序为:逻辑非运算! > 关系运算符(含等号、不等号) > 其它逻辑运算符(含与符号&、或符号|、异或符号^)。下面是比较逻辑运算和关系运算的优先级代码:

		// 比较逻辑与运算以及关系运算符的优先级顺序
boolean andResult = 1>2&3<4; // 等价于“(1>2)&(3<4)”
System.out.println("andResult="+andResult);
// 比较逻辑或运算以及关系运算符的优先级顺序
boolean orResult = 1>2|3<4; // 等价于“(1>2)|(3<4)”
System.out.println("orResult="+orResult);
// 比较逻辑异或运算以及关系运算符的优先级顺序
boolean xorResult = 1>2^3<4; // 等价于“(1>2)^(3<4)”
System.out.println("xorResult="+xorResult);
// 比较逻辑非运算以及关系运算符的优先级顺序
boolean zhen = true;
boolean jia = false;
boolean notResult = zhen==!jia; // 等价于“zhen==(!jia)”
System.out.println("notResult="+notResult);

总结一下,倘若没有圆括号加以约束,那么对于数值变量来说,几种运算符的优先级顺序依次为:正号、负号 > 乘号、除号、取余号 > 加号、减号 > 大于号、等号、小于号、不等号 > 各种赋值符号;对于布尔变量来说,相关运算符的优先级顺序依次为:逻辑非 > 等号、不等号 > 逻辑与、或、异或 > 各种赋值符号。

Java开发笔记(十四)几种运算符的优先级顺序的更多相关文章

  1. Java开发笔记(四十五)成员属性与成员方法

    前面介绍了许多数据类型,除了基本类型如整型int.双精度型double.布尔型boolean之外,还有高级一些的如包装整型Integer.字符串类型String.本地日期类型LocalDate等等,那 ...

  2. Java开发笔记(四十二)日历工具的常见应用

    前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...

  3. Java开发笔记(四十)日期与字符串的互相转换

    前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰.简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述.既然日期时间 ...

  4. Java开发笔记(四十四)本地日期时间与字符串的互相转换

    之前介绍Calendar的时候,提到日历实例无法直接输出格式化后的时间字符串,必须先把Calendar类型转换成Date类型,再通过格式化工具SimpleDateFormat获得字符串.而日期时间的格 ...

  5. Java开发笔记(四十六)类的构造方法

    前面介绍了如何定义一个简单的类,以及它的成员属性和成员方法,从示例代码可以看到,不管是OrangeSimple还是OrangeMember,都要先利用关键字new创建一个实例,然后才能通过实例名称访问 ...

  6. Java开发笔记(四十八)类的简单继承

    前面介绍了类的基本用法,主要是如何封装一个类的各项要素,包括成员属性.成员方法.构造方法等,想必大家对类的简单运用早已驾轻就熟.所谓“物以类聚,人以群分”,之所以某些事物会聚在一起,乃是因为它们拥有类 ...

  7. Java开发笔记(四十九)关键字super的用法

    前面介绍了如何从Bird类继承而来Swallow类,按道理子类应当继承父类的所有要素,但是对于构造方法来说,Swallow类仅仅继承了Bird类的默认构造方法,并未自动继承带参数的构造方法.如果子类想 ...

  8. Java开发笔记(四十一)日历工具Calendar

    前面的文章提到,Date是Java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了Date的源码,造成该工具存在先天不足,比如getYear方法返回的不是纯正的公元纪年.ge ...

  9. Java开发笔记(四十三)更好用的本地日期时间

    话说Java一连设计了两套时间工具,分别是日期类型Date,以及日历类型Calendar,按理说用在编码开发中绰绰有余了.然而随着Java的日益广泛使用,人们还是发现了它们的种种弊端.且不说先天不良的 ...

随机推荐

  1. laravel 目录权限

    chown -R www:www /data/wwwroot   #变更目录所有者并向下传递 find /data/wwwroot/ -type d -exec chmod 755 {} \;   # ...

  2. autpmapper映射忽略某个属性

    1.直接加特性[IgnoreMap] 2.映射规则 CreateMap<BaseAccount, BaseAccountListDto>().ForMember(dest => de ...

  3. swust oj 1012

    哈希表(链地址法处理冲突) 1000(ms) 10000(kb) 2542 / 6517 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法 ...

  4. .NET 应用架构电子书中文版

    <.NET 微服务:容器化 .NET 应用架构指南> 本书主要介绍了基于容器和微服务的应用架构和设计原则,以及基于 .NET Core 和 Docker 容器的应用程序开发实践.为了让大家 ...

  5. [Swift]LeetCode479. 最大回文数乘积 | Largest Palindrome Product

    Find the largest palindrome made from the product of two n-digit numbers. Since the result could be ...

  6. [Swift]LeetCode691. 贴纸拼词 | Stickers to Spell Word

    We are given N different types of stickers. Each sticker has a lowercase English word on it. You wou ...

  7. [Swift]LeetCode856. 括号的分数 | Score of Parentheses

    Given a balanced parentheses string S, compute the score of the string based on the following rule: ...

  8. springmvc 请求参数解析细节

    springmvc 的请求流程,相信大家已经很熟悉了,不熟悉的同学可以参考下资料! 有了整体流程的概念,是否对其中的实现细节就很清楚呢?我觉得不一定,比如:单是参数解析这块,就是个大学问呢? 首先,我 ...

  9. 使用javamelody进行web监控

    引入maven依赖 <dependency> <groupId>net.bull.javamelody</groupId> <artifactId>ja ...

  10. Python 的字符串

    Python 的字符串 在最新的 Python 3 版本中,字符串是以 Unicode 编码的,也就是说,Python 的字符串支持多语言,例如: print('包含中文的 str') 对于单个字符的 ...