Java学习笔记2.3.7 运算符与表达式 - 运算优先级与表达式

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.3.7 运算符与表达式 - 运算优先级与表达式相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 了解Java运算优先级
  2. 能争取书写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=2ab+b24ac
上下标和分式全部要处理成单行,并且乘法运算符“*”不能省略:

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 4x3y25y2z4+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 2x23x+74x2+5x1+3y2+7y32y25y+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+5x24x+72x23x5 +x3

任务2、已知圆的半径,编程求圆的周长和面积

  • 要求定义圆周率符号常量PI = 3.141596
  • 要求圆周长与圆面积结果保留两位小数

四、拓展阅读

(一)直击内核:打牢基础,以不变应万变

  • 计算机行业总会出现很多新东西,变化无处不在。很多人问,怎么学习新技术?怎么跟上新变化?我想说的是,要想应对变化,很重要的一点叫以无招胜有招,以不变应万变。

  • 之所以这么说是因为,变化都是表面的东西,内在的东西其实变化不大。也就是说,理论层面变得不多,只是在形式上今天一个样,明天另一个样。所以要应对这种变化,你一定得打牢自己的理论基础,提升内功修养,比如编程的一些方式、修饰模式(添加新的行为的设计模式)、解耦、提升代码重用度等。提升代码重用度必须解耦,必须提升抽象能力,这些都是很基础的内容。无论用什么语言,都是这么做的。

  • 当你打牢了基础,就更容易突破瓶颈。技术世界里不存在最变会造成质变的现象。什么意思呢?量变到质变是说,我们砌砖头建房子,砖头砌够了,就可以把房子建出来。但在技术领域不是这样的。你砌砖头砌得再多,一个模块的代码写得再多,也不能让你能成为一个架构师,因为你不懂原理,不懂科学方法。只有掌握了原理,你的能力才能长上去。就像学数学一样,当你掌握了微积分这种“大杀器”,你解题的能力就会所向披靡,而微积分绝对不是你能“量变”出来的。

  • 所以你必须学习基础的理论知识,如果只学一些表面上的解题思路和方法,技术的形式一变化,你会发现以前学的都没用了,要从头再学一遍。

  • 掌握技术基础可以帮你推导出问题的答案,因为基础是抽象和归纳,很容易形成进一步的推论。我们学的很多技术实现都逃不脱基础原理,不管是 Java,还是其他语言,只要用TCP(传输控制协议),用的都是相同的原理。所以你只要抓住原理,举一反三,时间长了就能自己推导答案。

  • 对于技术的基础,我分成以下四类。

序号类别说明
1程序语言语言的原理,类库的实现,编程技术(并发、异步等),编程范式,设计模式……
2系统原理计算机系统,操作系统,网络协议,数据库原理……
3中间件消息队列,缓存系统,网关代理,调度系统……
4理论知识算法和数据结构,数据库范式,网络七层模型,分布式系统……
  • 这些知识其实就是一个计算机科学专业的学生所要学习的原理,如果你的学校没有教或教得不好,一定要自己去看经典的教材,世界上最优秀的计算机教科书都有教。
  • 当然,就算自学,这些基础技术也需要大概四五年的时间积累。过去 20 年来,大家都说技术日新月异,但其实原理都没变,变的只是形式,核心还是这些内容。是否掌握这些原理直接影响你能飞多高,因为懂原理的人和不懂原理的人能解决的问题完全是两个层级。

(二)主动学习:提高你的学习效率

  • 说到学习,其实有很多种方法,读书、听讲是学习,讨论、实践也是学习,但学习和学习之间还是有一定的差别。
  • 美国缅因州的国家训练实验室曾经发布过一张学习金字塔图,从图里我们可以看到,学习方法分为两大类,一悉是被动学习,也是浅度学习,包括听讲、阅读、视听、演示;另一类是主动学习,与人讨论,自己动手实践,教授给别人都属于主动学习。主动学习我们称之为深度学习,如果你不能深度学习,你就不能真正学到东西。


    因此要想更高效地学习,你必定要经历一个从被动学习到主动学习的转换过程。对软件工程师来说,写博客、做分享都是很好的主动学习的方式,建议你试一试。尝试之后你会发现,当你要去教别人,当你要把自己写的东西公之于众的时候,你一定会查很多东西,你会很上心,你会学得很系统。此外,与人讨论与亲身实践也都是很好的学习方式。

以上是关于Java学习笔记2.3.7 运算符与表达式 - 运算优先级与表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记2.3.3 运算符与表达式 - 关系运算符

Java学习笔记2.3.2 运算符与表达式 - 赋值运算符

Java学习笔记2.3.1 运算符与表达式 - 算术运算符

Java学习笔记2.3.4 运算符与表达式 - 逻辑运算符

Java学习笔记2.3.6 运算符与表达式 - 条件运算符

Java学习笔记2.3.5 运算符与表达式 - 位运算符