序言
在前一则该该文,壹哥给他们传授了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 基本上演算
public class TypeDemo04 { public static void main(String[] args) { //微积分操作符 //注意类别提高:两个数排序,结果取决于范围大的数!比如说两个int排序,结果还是int; //而int与浮点数进行排序,则结果为浮点数,即结果变成更大范围的类别,这就是类别提高! int a = 10; //double b = 20.0; int b=20; //+号的第1个促进作用:微积分排序System.out.println(a+b); System.out.println(a-b); System.out.println(a*b); //两个int类别相除或相乘,结果依然是int,不会出现小数哦!而且会向下取整。 System.out.println(a/b); System.out.println(a%b); //除法和取模演算中,右操作数不能取0 System.out.println(a/0); } }他们要特别注意,整数由于存在范围的限制,如果排序结果超出了范围,就会产生溢出。而溢出不会出错,但会得到一个奇怪的结果。
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个机能,一是能进行加法操作,二是能进行字符串拼接。尤其是在进行字符串拼接时,要考虑自左向右的结合性。当字符串在前,数字在后,执行字符串拼接操作;当数字在前,字符串字后,先排序出结果,再进行字符串的拼接。
public class TypeDemo04 { public static void main(String[] args) { //+号的第2个促进作用:字符串拼接,自左向右的结合性,字符串在前,数字在后,执行字符串拼接操作。 System.out.println(“hello”+1+2);//hello12 //自左向右的结合性:数字在前,字符串字后,先排序出结果,再进行字符串的拼接。 System.out.println(1+2+“hello”); //3hello System.out.println(1+2+“hello”+3+4);//3hello34 } }2.5 %的促进作用
%是取余记号,他们能进行取余演算,也叫做取模演算。另外%在Java中不但能对整数进行取模,还能对double进行取模操作。
public class TypeDemo04 { public static void main(String[] args) { int c = 34; System.out.println(c/10); System.out.println(c%10); } }2.6 自增与自减
对初学者来说,有两个记号可能会让你比较懵圈,一个是++,一个是–,这两个记号分别叫做自增和自减操作符。++是自增记号,根据++在变量前或变量后的位置不同,也具备不同的特点,–自减记号同样如此。++和–具备如下特点:
● ++和– 既能放在变量的后边,也能放在变量的前边;
● 单独使用时, ++和– 无论是放在变量的前边还是后边,结果都是一样的;
● 参与操作时,如果放在变量的后边,会先使用变量参与操作,再取变量的值进行++或者–;
● 参与操作时,如果放在变量的前边,会先取变量的值进行++或者–,后使用变量参与操作;
● 多于变量才能使用自增/自减操作符,常量不能使用自增与自减记号,因为常量不允许被修改。
public class TypeDemo04 { public static void main(String[] args) { //++自增 与 –自减操作 int d = 10; d++; //d = d + 1; 先使用,再自增 System.out.println(d); //11 ++d;//先自增,再使用 System.out.println(d); //12 //先使用再自增:在本语句中,先使用变量d,在本语句结束之后再对变量d进行自增。 System.out.println(d++); //12 13 //先自增再使用:在本语句中,先对变量d进行自增,然后把自增后的结果在语句中进行输出。 System.out.println(++d);//14 //这个事例比较复杂,你好好琢磨一下吧 int x = 10; int y = 8; //执行过程:10 – 9 + 8 + 10 – 7 =12 System.out.println(x++ – –x + y– + x++ – –y); } }【++变量】变量先+1,然后使用变量+1之后的值;【变量++】先使用变量原来的值,表达式结束时给变量+1。所在在本事例中,如果++在变量之后,比如说d++,具备“先使用,再自增”的特点。如果++在变量之前,比如说++d,具备“先自增,再使用”的特点。–自减记号也是如此。壹哥不建议初学者把++演算混入到常规演算中,容易把你给搞懵逼哦。
三、表达式操作符
1. 基本上概念
在Java中,“=”是表达式操作符,而不是他们通常认知中的“等号”。表达式操作符用作将“=”右侧表达式的结果,表达式给“=”左侧的变量。另外,除了“=”这个表达式记号之外,还有另外几个扩展的表达式记号,所以目前常用的表达式记号有如下几个:
= += -= *= /= %=
2. 事例
2.1 表达式事例
以下是几个表达式操作符的基本上使用事例。在下面的事例中,他们要注意除法的排序结果哦。
public class TypeDemo04 { public static void main(String[] args) { //=表达式操作符 int a = 10; a += 2; //12,相当于 a=a+2;System.out.println(“a=”+a); a -= 3; //9,a = a – 3; System.out.println(“a=”+a); a *= 4; //36,a = a * 4; System.out.println(“a=”+a); //注意:Java中的除法,36/5=7哦,不会等于7.2,想想这是为什么? a /= 5; //7,a = a / 5; System.out.println(“a=”+a); a %= 6; //1,a = a % 6; System.out.println(“a=”+a); } }2.2 扩展事例
为的是让他们更快地认知表达式操作符,壹哥再给他们扩展一个事例。
public class TypeDemo04 { public static void main(String[] args) { //=表达式操作符 //笔试题:short s1 = 1; short s2 = 1; s2 = s1 + s2的结果是什么? s2 += s1的结果是什么? short s1 = 1; short s2 = 1; //类别提高:s1+s2变成了int类别 //此行代码会报错,因为演算中s提高为int类别,演算结果int表达式给short可能损失精度 // s2 = s1 + s2; //错误 //此行代码没有问题,这里暗含了强制性隐式,相当于s = (short) (s + 10); s2 += s1; // 正确 System.out.println(s2); } }在这个事例中,他们一定要注意类别提高的问题。两个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. 事例
接下来他们再通过一些代码事例,来学习一下亲密关系操作符的用法吧。他们在使用比较演算时,最终都会得到一个布尔类别的值。且在进行比较演算时,一定要注意其优先级。
public class TypeDemo04 { public static void main(String[] args) { // 亲密关系操作符 int a = 10; int b = 20; System.out.println(a > b); System.out.println(a >= b); System.out.println(a < b); System.out.println(a <= b); System.out.println(a == b); System.out.println(a != b); // 判断奇数与偶数 // 偶数前提: a % 2 == 0 // 奇数前提: a % 2 != 0 System.out.println(“a != b “ + (a != b)); System.out.println(“a % 2 != 0 “ + (a % 2 != 0)); } }五、方法论操作符
1. 基本上概念
Java中的方法论操作符, 主要有3个:方法论与&&、方法论或||、方法论非!,如下所示:
&& || !
Java中的方法论操作符,其实和微积分中的与、或、非意思一致。 方法论操作符大多数会和其它的操作符一起使用,主要做一些单纯或复杂的方法论演算。且通常都会和 if、for等方法论表达式一起使用,使用格式为:表达式1 方法论操作符 表达式2
2. 事例
接下来他们通过一个事例来演示方法论操作符该如何使用。
public class TypeDemo04 { public static void main(String[] args) { // 方法论操作符,结果是boolean类别 int a = 17; //a是否是一个偶数且大于10 //短路与:如果前提表达式中,前面的结果为false,就不再执行后面的表达式,效率较高。System.out.println(a % 2 == 0 && a > 10); //即使前提表达式中,前面的结果为false,依然会执行后面的表达式,效率较低。 System.out.println(a % 2 == 0 & a > 10); //a是一个奇数,或是否小于15 //短路或:如果前提表达式中,前面的结果为false,就不再执行后面的表达式,效率较高。 System.out.println(a % 2 != 0|| a <15); //即使前提表达式中,前面的结果为false,依然会执行后面的表达式,效率较低。 System.out.println(a % 2 != 0 | a < 15); //a是否是一个奇数? System.out.println(!(a % 2 == 0)); //&、|的用法 int b = 10; int c = 12; boolean flag = b > c & b== 10; System.out.println(flag); } }对于上述代码中的方法论操作符,壹哥再给他们细说一下,他们要特别注意“短路与”和“短路或”的基本上概念:
● &&:方法论与(短路与)。所有的是结果为true,最终的结果才是true。&&属于短路与:方法论与遵守短路求值的规则,即表达式1为假,表达式2就不再执行。即如果左边的表达式为真,右边的表达式就会执行;如果左边为假,右边不执行。
● ||:方法论或(短路或)。所有的是结果只要有一个为true,最终结果就是true。||属于短路或:遵守或也遵守短路求值的规则,即表达式1为真,表达式2就不在执行,否则就执行表达式2。
● !: 方法论非。对结果进行取反。
● &:按位与。无论前提表达式的结果如何,都会执行完整个表达式,所在无论左边的表达式是真假,右边的表达式都要执行。
● |:按位或。无论前提表达式的结果如何,都会执行完整个表达式。无论左边的表达式是真假,右边的表达式都要执行。
六、位操作符
1. 基本上概念
他们知道,对任何编程语言而言,最终的操作都是用二进制表示,因为排序机的底层只认识二进制。而八进制、十进制或者十六进制,都是为的是让开发人员方便开发而创立的。在Java中,也能根据数的进制进行演算,这就需要位操作符的参与了。常用的位操作符有如下几个:
& | ^ ~ << >> >>>
注意:& 和 | 既是位操作符,也能进行方法论演算。
2. 事例
接下来他们通过一个事例来演示位操作符该如何使用。
public class TypeDemo04 { public static void main(String[] args) { //位操作符 //按位与& System.out.println(18 & 23); //按位或| System.out.println(16 | 37); //按位亦或 System.out.println(13 ^ 34); //按位取反 System.out.println(~14); System.out.println(~-18); //左移 << System.out.println(18 << 2); //右移 >> System.out.println(23 >> 2); System.out.println(-18 >> 2); //无记号右移 >>> System.out.println(-23 >>> 2); } }针对上述代码,壹哥给他们解释一下:
2.1 按位与
按位与&的特点:相同数位都是1,最终的结果才是1。基本上规则如下:
0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 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. 事例
public class TypeDemo04 { public static void main(String[] args) { //前提表达式,长瓣操作符 //判断年龄,如果大于18岁,输出成年人,否则输出未成年人 int age = 70; String s = age > 18 ? “成年人” : “未成年人”; System.out.println(s); //a和b比较,输出较大的数字 int a = 10; int b = 20; int num = a > b ? a : b; System.out.println(num); //长瓣操作符嵌套使用 //判断年龄。如果大于18岁,输出成年人;但如果大于60岁,输出老年人,否则输出未成年人 String s1 = age > 18 ? age > 60 ? “老年人” : “成年人” : “未成年人”; System.out.println(s1); } }长瓣操作符虽然能嵌套使用,但他们在开发时尽量不要这么使用,这样的代码可读性很差。
八、类别比较操作符
在Java中还有一个类别比较操作符instance of,用作对Java的对象类别进行比较,能判断定义的变量是否属于某个类,该类能是(接口、抽象类)。语法格式如下:
boolean = 变量 instanceof 类
因为目前他们还没有学习Java面向对象的内容,所以这里他们先做个了解,知道有这么一个记号就能了。后面壹哥会在讲面向对象时,再单独对该记号的使用进行传授。
——————————正片已结束,来根事后烟—————————-
九、结语
至此,壹哥就把Java里的各式各样常见操作符给他们传授完毕了,现在你学会了吗?其实这些操作符记忆起来并不复杂,微积分操作符的含义和使用与微积分里的一样,这根本就不用单独记忆。他们只需要去记一些较为特殊的操作符用法和特点,比如说长瓣操作符、方法论操作符、位操作符等。
十、今日作业
第一题
java中37.2%10的演算结果是多少?评论区告诉我吧
第二题
00101010(&)00010111语句的执行结果是哪个?
A. 00000010 B. 11111111 C. 00111111 D. 11000000
第三题
如何高效地排序出2的幂次方?评论区给出你的同时实现思路