Java运算符一. 运算符二. 算术运算符2.1 基本四则运算符加减乘除模( - * / %)2.2 增量运算符 - * %2.3 自增/自减运算符 --三. 关系运算符四. 逻辑运算符(重点)4.1 逻辑与 4.2 逻辑 ||4.3 逻辑非 !4.4 短路求值五. 位运算符5.1 按位与 5.2 按位或 |:5.3 按位取反 ~5.4 按位异或 ^六. 移位运算(了解)6.1 左移 6.2 右移 6.3 无符号右移 七. 条件运算符八. 运算符的优先级一. 运算符即对操作数进行操作时的符号不同运算符操作的含义不同。Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下算术运算符( - * /)、关系运算符( )、逻辑运算符、位运算符、移位运算符以及条件运算符等。二. 算术运算符2.1 基本四则运算符加减乘除模( - * / %)inta20;intb10;System.out.println(ab);// 30System.out.println(a-b);// 10System.out.println(a*b);// 200System.out.println(a/b);// 2System.out.println(a%b);// 0 ---模运算相当于数学中除法的余数注意都是二元运算符使用时必须要有左右两个操作数int / int 结果还是int类型而且会向下取整inta3;intb2;// 在数学中应该是1.5 但是在Java中输出结果为1 会向下取整即⼩数点之后全部舍弃掉了System.out.println(a/b);// 如果要得到数学中的结果可以使⽤如下⽅式doubleda*1.0/b;System.out.println(d);• 做除法和取模时右操作数不能为0inta1;intb0;System.out.println(a/b)// 运⾏结果//Exception in thread main java.lang.ArithmeticException: / by zero,at Test.main(Test.java:5)% 不仅可以对整型取模也可以对double类型取模但是没有意义⼀般都是对整型取模的C语言不能使用小数System.out.println(11.5%2.0);// 运⾏结果//1.5两侧操作数类型不一致时向类型大的提升System.out.println(10.2);// 的左侧是int右侧是double在加之前int被提升为double 故输出1.2取余的正负取决于左边的操作数2.2 增量运算符 - * %该种类型运算符操作完成后会将操纵的结果赋值给左操作数。inta1;a2;// 相当于 a a 2System.out.println(a);// 输出3a-1;// 相当于 a a - 1System.out.println(a);// 输出2a*3;// 相当于 a a * 3System.out.println(a);// 输出6a/3;// 相当于 a a / 3System.out.println(a);// 输出2a%3;// 相当于 a a % 2System.out.println(a);// 输出2注意增量运算符在计算的时候可以不进行强制类型转换doublea10.4;intb10;ba;//不会报错bba;//此时会编译报错等号右边被提升为了double类型2.3 自增/自减运算符 –是给变量的值1–是给变量的值-1。inta1;a;// 后置 表⽰给a的值加1此时a的值为2System.out.println(a);// 注意后置是先使⽤变量原来值表⽰式结束时给变量1因此输出2System.out.println(a);// 输出3a;// 前置 表⽰给a的值加1System.out.println(a);// 注意前置是先给变量1然后使⽤变量中的值因此输出5System.out.println(a);// 输出5// --操作符给操作-1与含义类似注意如果单独使用【前置】和【后置】没有任何区别如果混合使用【前置】先1然后使用变量1之后的值【后置】先使用变量原来的值表达式结束时给变量1只有变量才能使用自增/自减运算符常量不能使用因为常量不允许被修改。三. 关系运算符关系运算符主要有六个: ! 其计算结果是 true 或者 false。inta10;intb20;// 注意在Java中 表⽰赋值要与数学中的含义区分// 在Java中 表⽰相等System.out.println(ab);// falseSystem.out.println(a!b);// trueSystem.out.println(ab);// trueSystem.out.println(ab);// falseSystem.out.println(ab);// trueSystem.out.println(ab);// false注意当需要多次判断时不能连着写比如3 a 5Java程序与数学中是有区别的(ture5)四. 逻辑运算符(重点)逻辑运算符主要有三个: || !运算结果都是boolean类型。4.1 逻辑与 语法规则表达式1 表达式2左右表达式必须是boolean类型的结果。相当于现实生活中的且两个表达式都为真结果才是真只要有一个是假结果就是假。表达式1表达式2结果真真真真假假假真假假假假inta1;intb2;System.out.println(a1b2);// 左为真 且 右为真 则结果为真System.out.println(a1b100);// 左为真 但 右为假 则结果为假System.out.println(a100b2);// 左为假 但 右为真 则结果为假System.out.println(a100b100);// 左为假 且 右为假 则结果为假4.2 逻辑 ||语法规则表达式1 || 表达式2左右表达式必须是boolean类型的结果。相当于现实生活中的或表达式1表达式2结果真真真真假真假真真假假假inta1;intb2;System.out.println(a1||b2);// 左为真 且 右为真 则结果为真System.out.println(a1||b100);// 左为真 但 右为假 则结果也为真System.out.println(a100||b2);// 左为假 但 右为真 则结果也为真System.out.println(a100||b100);// 左为假 且 右为假 则结果为假4.3 逻辑非 !语法规则! 表达式真变假假变真。表达式结果真假假真4.4 短路求值 和 || 遵守短路求值的规则System.out.println(102010/00);// 打印 falseSystem.out.println(1020||10/00);// 打印 true我们都知道,计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行,说明 10 / 0 并没有真正被求值。注意对于 ,如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式。对于 ||,如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式. 和 | 如果表达式结果为 boolean 时,也表示逻辑运算. 但与 || 相比,它们不支持短路求值。System.out.println(102010/00);// 程序抛出异常System.out.println(1020|10/00);// 程序抛出异常五. 位运算符Java 中数据存储的最小单位是字节而数据操作的最小单位是比特位。字节是最小的存储单位每个字节是由8个二进制比特位组成的多个字节组合在⼀起可以表示各种不同的数据。位运算符主要有四个 | ~ ^除 ~ 是一元运算符外其余都是二元运算符。位操作表示按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算。5.1 按位与 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.inta10;intb20;System.out.println(ab);进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 101005.2 按位或 |:如果两个二进制位都是 0, 则结果为 0, 否则结果为 1。inta10;intb20;System.out.println(a|b);注意当 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算5.3 按位取反 ~如果该位为 0 则转为 1, 如果该位为 1 则转为 0inta0xf;System.out.printf(%x\n,~a)注意0x 前缀的数字为十六进制数字。十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位。0xf 表示10进制的 15, 也就是二进制的 1111。printf 能够格式化输出内容, %x 表示按照示十六进制输出。\n 表示换行符5.4 按位异或 ^如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1inta0x1;intb0x2;System.out.printf(%x\n,a^b);注意如果两个数相同则异或的结果为0找只出现一次的数字在这里插入图片描述六. 移位运算(了解)移位运算符有三个: 都是二元运算符且都是按照二进制比特位来运算的。6.1 左移 最左侧位不要了, 最右侧补0。inta0x10;System.out.printf(%x\n,a1);// 运⾏结果(注意, 是按⼗六进制打印的)20注意向左移位时丢弃的是符号位因此正数左移可能会变成负数。6.2 右移 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)inta0x10;System.out.printf(%x\n,a1);// 运⾏结果(注意, 是按⼗六进制打印的)8intb0xffff0000;System.out.printf(%x\n,b1);// 运⾏结果(注意, 是按⼗六进制打印的)ffff80006.3 无符号右移 最右侧位不要了, 最左侧补 0inta0xffffffff;System.out.printf(%x\n,a1);// 运⾏结果(注意, 是按⼗六进制打印的)7fffffff注意左移 1 位, 相当于原数字 * 2左移 N 位, 相当于原数字 * 2 的N次方. 【针对正数而言】右移 1 位, 相当于原数字 / 2右移 N 位, 相当于原数字 / 2 的N次方。【针对正数而言】由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替. 【针对正数而言】移动负数位或者移位位数过大都没有意义。七. 条件运算符条件运算符只有⼀个表达式1 ? 表达式2 : 表达式3当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值。也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法。// 求两个整数的最⼤值inta10;intb20;intmaxab?a:b;注意表达式2和表达式3的结果要是同类型的除非能发生类型隐式类型转换inta10;intb20;intcab?1:2.0;表达式不能单独存在其产生的结果必须要被使用。inta10;intb20;ab?a:b;// 报错Error:(15, 14) java: 不是语句八. 运算符的优先级在一条表达式中各个运算符可以混合起来进行运算但是运算符的优先级不同比如* 和 / 的优先级要高于 和 -。// 求a和b的平均值inta10;intb20;intca(b-a)1;System.out.println(c);上述表达式中由于 的优先级要高于 , 因此a先和b-a的结果做加法整体为20最后再进行右移因此结果为10。在这里插入图片描述