Java学习笔记2.3.7 运算符与表达式 - 运算优先级与表达式
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.3.7 运算符与表达式 - 运算优先级与表达式相关的知识,希望对你有一定的参考价值。
文章目录
零、本讲学习目标
- 了解Java运算优先级
- 能争取书写Java表达式
一、运算优先级
(一)运算优先级概述
-
所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。
-
乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。
-
一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
(二)运算优先级表
- Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级最低。在同一个表达式中运算符优先级高的先执行。下表 列出了所有的运算符的优先级以及结合性。
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、 | 从左向右 |
2 | !、+、-、~、++、– | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | <<、>>、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ? : | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、<<=、>>=、>>>= | 从右向左 |
(三)简要说明
- 如果实在搞不清默认的运算优先级,那么利用括号来改变运算次序,满足实际运算的需要即可。
二、Java表达式
(一)表达式的概念
- 用运算符把常量或者变量连接起来符合Java语法的式子就称为表达式。
(二)表达式的值与类型
- 表达式的值就是表达式进行运算得到的结果
- 表达式的数据类型就是表达式的值的数据类型
(三)表达式的运算顺序
- 应按照运算符的优先级从高到低的顺序进行
- 优先级相同的运算符按照事先约定的结合方向进行
(四)书写表达式的注意事项
- 只能是单行书写
- 不省略任何运算符
- 只能使用圆括号
例如:
x
1
=
−
b
+
b
2
−
4
a
c
2
a
x_1=\\displaystyle \\frac-b+\\sqrtb^2-4ac2a
x1=2a−b+b2−4ac
上下标和分式全部要处理成单行,并且乘法运算符“*”不能省略:
x1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
又如: y = 4 + 3 5 x 3 − [ 2 x 2 − ( 6 x + 5 ) ] y=4 + 3\\5x^3-[2x^2-(6x+5)]\\ y=4+35x3−[2x2−(6x+5)],写成Java表达式只能使用圆括号,并且乘法运算符“*”不能省略:
y = 4 + 3 * (5 * x * x * x - (2 * x *x - (6 * x + 5)));
三、课后作业
任务1、将数学公式转换成Java表达式
- 4 x 3 y 2 − 5 y 2 z 4 + 7 z 3 x 2 4x^3y^2-5y^2z^4+7z^3x^2 4x3y2−5y2z4+7z3x2
- 4 x 2 + 5 x − 1 2 x 2 − 3 x + 7 + 2 y 2 − 5 y + 1 3 y 2 + 7 y − 3 \\displaystyle \\frac4x^2+5x-12x^2-3x+7+\\frac2y^2-5y+13y^2+7y-3 2x2−3x+74x2+5x−1+3y2+7y−32y2−5y+1
- 2 x 2 − 3 x − 5 + x − 3 x 3 + 5 x 2 − 4 x + 7 \\displaystyle \\frac\\sqrt2x^2-3x-5+ x-3x^3+5x^2-4x+7 x3+5x2−4x+72x2−3x−5+x−3
任务2、已知圆的半径,编程求圆的周长和面积
- 要求定义圆周率符号常量PI = 3.141596
- 要求圆周长与圆面积结果保留两位小数
四、拓展阅读
(一)直击内核:打牢基础,以不变应万变
-
计算机行业总会出现很多新东西,变化无处不在。很多人问,怎么学习新技术?怎么跟上新变化?我想说的是,要想应对变化,很重要的一点叫以无招胜有招,以不变应万变。
-
之所以这么说是因为,变化都是表面的东西,内在的东西其实变化不大。也就是说,理论层面变得不多,只是在形式上今天一个样,明天另一个样。所以要应对这种变化,你一定得打牢自己的理论基础,提升内功修养,比如编程的一些方式、修饰模式(添加新的行为的设计模式)、解耦、提升代码重用度等。提升代码重用度必须解耦,必须提升抽象能力,这些都是很基础的内容。无论用什么语言,都是这么做的。
-
当你打牢了基础,就更容易突破瓶颈。技术世界里不存在最变会造成质变的现象。什么意思呢?量变到质变是说,我们砌砖头建房子,砖头砌够了,就可以把房子建出来。但在技术领域不是这样的。你砌砖头砌得再多,一个模块的代码写得再多,也不能让你能成为一个架构师,因为你不懂原理,不懂科学方法。只有掌握了原理,你的能力才能长上去。就像学数学一样,当你掌握了微积分这种“大杀器”,你解题的能力就会所向披靡,而微积分绝对不是你能“量变”出来的。
-
所以你必须学习基础的理论知识,如果只学一些表面上的解题思路和方法,技术的形式一变化,你会发现以前学的都没用了,要从头再学一遍。
-
掌握技术基础可以帮你推导出问题的答案,因为基础是抽象和归纳,很容易形成进一步的推论。我们学的很多技术实现都逃不脱基础原理,不管是 Java,还是其他语言,只要用TCP(传输控制协议),用的都是相同的原理。所以你只要抓住原理,举一反三,时间长了就能自己推导答案。
-
对于技术的基础,我分成以下四类。
序号 | 类别 | 说明 |
---|---|---|
1 | 程序语言 | 语言的原理,类库的实现,编程技术(并发、异步等),编程范式,设计模式…… |
2 | 系统原理 | 计算机系统,操作系统,网络协议,数据库原理…… |
3 | 中间件 | 消息队列,缓存系统,网关代理,调度系统…… |
4 | 理论知识 | 算法和数据结构,数据库范式,网络七层模型,分布式系统…… |
- 这些知识其实就是一个计算机科学专业的学生所要学习的原理,如果你的学校没有教或教得不好,一定要自己去看经典的教材,世界上最优秀的计算机教科书都有教。
- 当然,就算自学,这些基础技术也需要大概四五年的时间积累。过去 20 年来,大家都说技术日新月异,但其实原理都没变,变的只是形式,核心还是这些内容。是否掌握这些原理直接影响你能飞多高,因为懂原理的人和不懂原理的人能解决的问题完全是两个层级。
(二)主动学习:提高你的学习效率
- 说到学习,其实有很多种方法,读书、听讲是学习,讨论、实践也是学习,但学习和学习之间还是有一定的差别。
- 美国缅因州的国家训练实验室曾经发布过一张学习金字塔图,从图里我们可以看到,学习方法分为两大类,一悉是被动学习,也是浅度学习,包括听讲、阅读、视听、演示;另一类是主动学习,与人讨论,自己动手实践,教授给别人都属于主动学习。主动学习我们称之为深度学习,如果你不能深度学习,你就不能真正学到东西。

因此要想更高效地学习,你必定要经历一个从被动学习到主动学习的转换过程。对软件工程师来说,写博客、做分享都是很好的主动学习的方式,建议你试一试。尝试之后你会发现,当你要去教别人,当你要把自己写的东西公之于众的时候,你一定会查很多东西,你会很上心,你会学得很系统。此外,与人讨论与亲身实践也都是很好的学习方式。
以上是关于Java学习笔记2.3.7 运算符与表达式 - 运算优先级与表达式的主要内容,如果未能解决你的问题,请参考以下文章