java 运算符类型都有哪些
前言
在前一篇文章中,壹哥给大家讲解了 Java 数据类型之间的转换,包括自动类型转换、强制类型转换、隐含的强制类型转换等问题。且在上一篇文章中,我还简单地给大家提到了 Java 的类型提升。在类型提升的案例中,我们涉及到了 Java 里的运算符。有的小伙伴会很好奇,Java 里的运算符都有哪些呢?加减乘除这些符号都有吗?实际上,Java 中的运算符不仅仅只有加减乘除哦,还有很多其他的运算符。那么今天壹哥
就用一篇专门的文章,给大家讲解运算符相关的知识。#运算符 #
------------------------------前戏已做完,精彩即开始------------------------------
全文大约【6400】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......
一、运算符简介
1. 概述
电脑的大名之所以被称为”计算机“,是因为它最基本、最起初的作用就是进行数学运算。为了实现计算功能,Java 为我们提供了多种运算符用于各种计算,比如算术运算符(+ - * /)、 关系运算符(< > ==)、逻辑运算符、位运算符、条件运算符等等。
2. 分类
如果我们把运算符按照功能来分,可以分为算术运算符、关系运算符、赋值运算符、逻辑运算符、位运算符、三目运算符、逗号运算符等各种运算符。
如果按照操作数的数目来分,可以把这些运算符分为单目运算符、双目运算符和三目运算符,分别对应于 1 个、2 个、3 个操作数。
3. 运算符的目
我们把运算符能够连接操作数的个数,称为运算符的目,Java 中运算符的目有三种:
● 单目运算符:只能连接一个操作数,如“+ +”、”--”;
● 双目运算符:可以连接两个操作数,Java 语言中多数运算符都属于双目运算符,如“+、-、*”等;
● 三目运算符:可以连接三个操作数,Java 语言中只有一个三目运算符,即条件运算符”? :“。
4. 运算符的优先级
运算符的优先级是指在表达式中出现多个不同的运算符,在进行计算时运算符执行的先后次序。比如算术运算符中,乘除运算符的优先级高于加减运算符的优先级。在 Java 语言中,不同的运算符具有不同的优先级,我们在开发时要优先处理优先级高的运算符。参考下图:
这么多的优先级规则,你很难记得住,其实你也不必记忆,我们在使用时直接加括号就可以了,和数学里的规则一样。
5. 运算符的结合方向
运算符的结合方向又称为结合性,是指当一个操作数连接两个相同优先级的运算符时,会按运算符所规定的结合方向进行处理。Java 中各运算符的结合性分为两种,分别为左结合性(自左向右)和右结合性(自右向左)。比如常见的+、-、*、/等运算就是自左向右,而 Java 里的=赋值运算,则是从右向左。
在 Java 中,所有的数学运算都是从左向右进行运算的,其他的大部分运算也是遵守从左向右的规则。但一元运算符,赋值运算符和三目运算符例外,他们是从右向左进行运算的。
了解完这些基本的知识之后,接下来壹哥就通过一些代码案例,分别给大家讲解一下这几种运算符的用法。
二、算术运算符
1. 概念
算术运算符与我们在数学中学习的计算符号一样,主要用在数学表达式中,常见的算术运算符有:
+ - * / % ++ --
这几个符号的功能如下表所示:
2. 案例
壹哥在这里设计了如下案例,大家要跟着练习哦。
2.1 基本运算
我们要特别注意,整数由于存在范围的限制,如果计算结果超出了范围,就会产生溢出。而溢出不会出错,但会得到一个奇怪的结果。
2.2 除零算术异常
另外壹哥还要提醒大家一下,在 Java 中的除法和取模运算,和数学中的要求一样,是不能做除零操作的,否则在运行时会产生异常哦!这里会产生 java.lang.ArithmeticException: / by zero 的异常。
2.3 类型提升(重点)
我们在进行数值计算时,要注意类型提升的问题。当算术表达式中包含不同的基本类型值时,整个算术表达式的类型会进行自动提升。基本的提升规则为:
为了计算方便,Java 会将小于 4 个字节的类型,在计算时将其隐形提升到 int 类型。所以 byte 类型、short 类型和 char 类型会被提升为 int 类型,不管是否有其他类型参与运算。也就是说,整个表达式的类型会自动提升到与表达式中最高等级的操作数相同的类型。所以两个数值进行计算,结果取决于范围更大的那个数!比如两个 int 计算,结果是 int。而 int 与浮点数进行计算,则结果为浮点数,即结果变成更大范围的类型,这就是类型提升!
提升等级顺序为:
byte、short、char --> int --> long --> float --> double
所以由于类型提升的原因,我们在开发时很少使用 byte 或者 short 来定义整数。也很少会使用 char 类型定
义字符,而是使用字符串类型,更不会使用 char 类型做算术运算。
2.4 +号的两个作用
Java 中的+号有 2 个功能,一是可以进行加法操作,二是可以进行字符串拼接。尤其是在进行字符串拼接时,要考虑自左向右的结合性。当字符串在前,数字在后,执行字符串拼接操作;当数字在前,字符串字后,先计算出结果,再进行字符串的拼接。
2.5 %的作用
%是取余符号,我们可以进行取余运算,也叫做取模运算。另外 %在 Java 中不但可以对整数进行取模,还可以对 double 进行取模操作。
2.6 自增与自减
对初学者来说,有两个符号可能会让你比较懵圈,一个是++,一个是--,这两个符号分别叫做自增和自减运算符。++是自增符号,根据++在变量前或变量后的位置不同,也具有不同的特点,--自减符号同样如此。++和--具有如下特点:
● ++和-- 既可以放在变量的后边,也可以放在变量的前边;
● 单独使用时, ++和-- 无论是放在变量的前边还是后边,结果都是一样的;
● 参与操作时,如果放在变量的后边,会先使用变量参与操作,再取变量的值进行++或者--;
● 参与操作时,如果放在变量的前边,会先取变量的值进行++或者--,后使用变量参与操作;
● 只有变量才能使用自增/自减运算符,常量不能使用自增与自减符号,因为常量不允许被修改。
【++变量】变量先+1,然后使用变量+1 之后的值;【变量++】先使用变量原来的值,表达式结束时给变量+1。所在在本案例中,如果++在变量之后,比如 d++,具有“先使用,再自增”的特点。如果++在变量之前,比如++d,具有“先自增,再使用”的特点。--自减符号也是如此。壹哥不建议初学者把++运算混入到常规运算中,容易把你给搞懵逼哦。
三、赋值运算符
1. 概念
在 Java 中,“=”是赋值运算符,而不是我们通常认知中的“等号”。赋值运算符用于将“=”右侧表达式的结果,赋值给“=”左侧的变量。另外,除了“=”这个赋值符号之外,还有另外几个扩展的赋值符号,所以目前常用的赋值符号有如下几个:
= += -= *= /= %=
2. 案例
2.1 赋值案例
以下是几个赋值运算符的基本使用案例。在下面的案例中,大家要注意除法的计算结果哦。
2.2 扩展案例
为了让大家更好地理解赋值运算符,壹哥再给大家扩展一个案例。
在这个案例中,我们一定要注意类型提升的问题。两个 short 变量 s1 和 s2,s1+s2 时会进行类型提升变成 int,所以必须对结果进行强制类型转换才行,如下图所示:
但是当我们使用 s2+=s1 语句时,虽然计算结果与 s2=s1+s2 是相同的,但内部的执行原理却不同,这是因为扩展的赋值运算符都隐含了强制类型转换。s2 = s1 + s2;此行代码会报错,这是因为运算中 s 变量会提升为 int 类型,运算结果 int 赋值给 short 可能会损失精度。
而在 s2+=s1 语句中就没有问题,因为这里隐含了强制类型转换,相当于 s2 = (short) (s2 + s1);不用进行再额外强制类型转换,这一点我们一定要注意!
四、关系运算符
1. 概念
在 Java 中,关系运算符,又叫做比较运算符, 或者叫做布尔运算符,主要是用于比较两个表达式的结果。常用的赋值符号有如下几个:
> >= < <= == !=
2. 案例
接下来我们再通过一些代码案例,来学习一下关系运算符的用法吧。我们在使用比较运算时,最终都会得到一个布尔类型的值。且在进行比较运算时,一定要注意其优先级。
五、逻辑运算符
1. 概念
Java 中的逻辑运算符, 主要有 3 个:逻辑与 &&、逻辑或||、逻辑非!,如下所示:
&& || !
Java 中的逻辑运算符,其实和数学中的与、或、非意思一致。 逻辑运算符大多数会和其他的运算符一起使用,主要做一些简单或复杂的逻辑运算。且通常都会和 if、for 等逻辑表达式一起使用,使用格式为:表达式 1 逻辑运算符 表达式 2
2. 案例
接下来我们通过一个案例来演示逻辑运算符该如何使用。
对于上述代码中的逻辑运算符,壹哥再给大家细说一下,我们要特别注意“短路与”和“短路或”的概念:
● &&:逻辑与(短路与)。所有的结果为 true,最终的结果才是 true。&&属于短路与:逻辑与遵守短路求值的规则,即表达式 1 为假,表达式 2 就不再执行。即如果左边的表达式为真,右边的表达式就会执行;如果左边为假,右边不执行。
● ||:逻辑或(短路或)。所有的结果只要有一个为 true,最终结果就是 true。||属于短路或:遵守或也遵守短路求值的规则,即表达式 1 为真,表达式 2 就不在执行,否则就执行表达式 2。
● !: 逻辑非。对结果进行取反。
● &:按位与。无论条件表达式的结果如何,都会执行完整个表达式,所在无论左边的表达式是真假,右边的表达式都要执行。
● |:按位或。无论条件表达式的结果如何,都会执行完整个表达式。无论左边的表达式是真假,右边的表达式都要执行。
六、位运算符
1. 概念
我们知道,对任何编程语言而言,最终的操作都是用二进制表示,因为计算机的底层只认识二进制。而八进制、十进制或者十六进制,都是为了让开发人员方便开发而创立的。在 Java 中,也可以根据数的进制进行运算,这就需要位运算符的参与了。常用的位运算符有如下几个:
& | ^ ~ << >> >>>
注意:& 和 | 既是位运算符,也可以进行逻辑运算。
2. 案例
接下来我们通过一个案例来演示位运算符该如何使用。
针对上述代码,壹哥给大家解释一下:
2.1 按位与
按位与 &的特点:相同数位都是 1,最终的结果才是 1。基本规则如下:
2.2 按位或
按位或|的特点:只要相同数位上有 1,结果就是 1。
2.3 按位异或
按位亦或的特点:相同数位相同为 0,不同为 1。
2.4 按位取反
按位取反的特点:将每一位上的数字取反。结论:数字+1 取反。
2.5 左移
左移<<的特点:将二进制数位整体向左移动 N 位,低位补 0。
2.6 右移
右移>>的特点:将二进制数位整体向右移动 N 位。如果是正数补 0,负数补 1。
2.7 无符号右移
无符号右移>>>的特点:将二进制数位整体向右移动 N 位。高位补 0
PS:关于进制转换、原码、反码、补码等内容,壹哥会在后面的文章中专门讲解!
七、条件运算符
1. 概念
条件运算符,又叫做三目运算符,目前在 Java 中只有一个三目运算符 ? :三目运算的语法格式如下:
布尔表达式 ? 表达式 1 : 表达式 2
很多时候,三目运算都是 if 和 else 的简写。
2. 案例
三目运算符虽然可以嵌套使用,但我们在开发时尽量不要这么使用,这样的代码可读性很差。
八、类型比较运算符
在 Java 中还有一个类型比较运算符 instance of,用于对 Java 的对象类型进行比较,可以判断定义的变量是否属于某个类,该类可以是(接口、抽象类)。语法格式如下:
boolean = 变量 instanceof 类
因为目前我们还没有学习 Java 面向对象的内容,所以这里我们先做个了解,知道有这么一个符号就可以了。后面壹哥会在讲面向对象时,再单独对该符号的使用进行讲解。
------------------------------正片已结束,来根事后烟------------------------------
九、结语
至此,壹哥就把 Java 里的各种常见运算符给大家讲解完毕了,现在你学会了吗?其实这些运算符记忆起来并不复杂,算术运算符的含义和使用与数学里的一样,这根本就不用单独记忆。我们只需要去记一些较为特殊的运算符用法和特点,比如三目运算符、逻辑运算符、位运算符等。
十、今日作业
第一题
java 中 37.2%10 的运算结果是多少?评论区告诉我吧
第二题
00101010(&)00010111 语句的执行结果是哪个?
A. 00000010 B. 11111111 C. 00111111 D. 11000000
第三题
如何高效地计算出 2 的幂次方?评论区给出你的实现思路
评论