运算符概述
概念:对常量或者变量进行操作的符号。用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。
运算符按照其要求的操作数数目来分,可以有单目运算符(1 个操作数)、双目运算符(2 个 操作数)和三目运算符(3 个操作数)。
运算符按其功能来分,有算术运算符、赋值运算符、 关系运算符、逻辑运算符、位运算符、条件运算符等等
下面我们就来学习一下常用的运算符
算术运算符
Java中的算术运算符,如下图所示
实例
public class Demo {public static void main(String[] args) {// + - * : 跟小学数学的运算方式一样System.out.println(10 + 20); // 30System.out.println(10 - 20); //-10System.out.println(10 * 20); // 200/*/ : 整数相除,结果只能得到整数,如果想要得到带有小数的结果,必须加入小数(浮点类型)的运算*/System.out.println(10 / 2); // 5System.out.println(10 / 3); // 3System.out.println(10 / 3.0); // 3.3333333333333335/*%(取模) : 取余数 5 / 2 = 商2, 余数为1*/System.out.println(5 % 2); // 1}}
“+”号的两种用法
- 第一种:对于
+
两边都是数值的话,+
就是加法的意思
public class Demo {public static void main(String[] args) {// char类型参与算术运算,使用的是计算机底层对应的十进制数值。char c = 'a';System.out.println(c+ 1);//98// 两边都是数值System.out.println(1+2);// 3System.out.println(1+1.2); //2.2}
}
- 第二种:对于
+
两边至少有一边是字符串得话,+
就是拼接的意思。“+”符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串。
public class Demo {public static void main(String[] args) {int a = 5;//能算则算,不能算就拼接在一起。System.out.println("abc" + 'a'); // abcaSystem.out.println("abc" + a); // abc5System.out.println(5 + a); // 10System.out.println("abc" + 5 + 'a'); //abc5aSystem.out.println(15 + "abc" + 15); //15abc15System.out.println(a + 'a');//102System.out.println(a + "" + 'a');//5aSystem.out.println(a + 'a' + "it ");//102itSystem.out.println("it" + a + 'a');//it5aSystem.out.println("it" + (a + 'a'));//102it}
}
注意:
- / 和 % 的区别:两个数据做除法,/取结果的商,%取结果的余数。
- 整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
自增自减运算符
单独使用
变量在单独运算的时候,变量前++和变量后++,变量的是一样的;
- 变量前++ :例如 ++a
- 变量后++ :例如 a++
实例:
public class Demo04Test {public static void main(String[] args) {/*单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的*/int a = 10;++a; //等价于 a = a +1;System.out.println(a); // 11int b = 10;--b; //等价于 b = b -1;System.out.println(b); // 9}}
复合使用
和其他变量放在一起使用或者和输出语句放在一起使用,前++和后++就产生了不同。
- 变量前++ :变量先自身加1,然后再取值
- 变量后++ :变量先取值,然后再自身加1
实例
/*参与操作:++在前: 先对该变量做自增(++)或者自减(--),然后再拿变量参与操作。++在后: 先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(--)。*/
public class Demo05Test {public static void main(String[] args) {// ++在前: 先对该变量做自增(++)或者自减(--),然后再拿变量参与操作。int a = 10;int b = ++a;System.out.println(a); // 11System.out.println(b); // 11// ++在后: 先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(--)。a = 10;b = a++;System.out.println(a); // 11System.out.println(b); // 10}
}
总结:
- ++ 、-- 只能操作变量,不能操作字面量的。
- 最常见的用法:单独使用
赋值运算符
赋值运算符的作用是将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。
/*
基本赋值运算符: = : 将符号右侧的数据, 赋值给左边
*/
int a = 10; // 先看“=”右边,把数据10赋值给左边的变量a存储
扩展赋值运算符
实例
public class Demo06 {public static void main(String[] args) {int a = 3;int b = 4;b += a;// 相当于 b = b + a ;System.out.println(a); // 3System.out.println(b); // 7short s = 3;// s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度s += 4; // 此行代码没有问题,隐含了强制类型转换,相当于 s = (short) (s + 3);System.out.println(s); // 7}
}
注意:扩展的赋值运算符隐含了强制类型转换
关系运算符
关系运算符是对数据进行条件判断的符号,最终会返回一个比较的布尔结果(false,true)
实例
/*关系运算符(比较运算符) 都有哪些呢?> >= < <= == !=
*/
public class Demo{public static void main(String[] args) {int a = 3;int b = 4;System.out.println(a < b); // trueSystem.out.println(a > b); // falseSystem.out.println(a <= b); // trueSystem.out.println(a >= b); // falseSystem.out.println(a == b); // falseSystem.out.println(a != b); // true}
}
注意事项:
- 比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值true或者false
- 其中>,<,>=,<=不支持boolean,String类型,==和!=支持boolean和String。
逻辑运算符
逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。
逻辑运算符的特点
- 操作数都是布尔类型,并且最终的运算结果也是布尔类型
实例
/*逻辑运算符作用: 用于[整合]多个比较表达式的条件1. 连接多个比较表达式2. 连接true或false最终得到的结果都是boolean类型的true或false.
*/
public class Demo {/*逻辑运算符分类 :&(与) : 并且, 遇false则false, 只有符号左右两边同时为true, 结果才为true.|(或) : 或者, 遇true则true, 只有符号左边两边同时为false, 结果才为false!(非) : 取反^(异或) : 相同为false, 不同为true.*/public static void main(String[] args) {// &(与) : 并且System.out.println(true & true); // trueSystem.out.println(false & false); // falseSystem.out.println(true & false); // falseSystem.out.println(false & true); // falseSystem.out.println("------------------");// |(或) : 或者System.out.println(true | true); // trueSystem.out.println(false | false); // falseSystem.out.println(true | false); // trueSystem.out.println(false | true); // trueSystem.out.println("------------------");// !(非) : 取反System.out.println(!true); // falseSystem.out.println(!!true); // trueSystem.out.println("------------------");// ^(异或) :System.out.println(true ^ true); // falseSystem.out.println(false ^ false); // falseSystem.out.println(true ^ false); // trueSystem.out.println(false ^ true); // true}
}
短路逻辑运算符
&&和&区别:
- &&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。
||和|区别:
- ||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。
实例
/*
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,
没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。
同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。
*/
public class Demo {public static void main(String[] args) {int a = 10;int b = 20;System.out.println(a > 100 && ++b > 10); // falseSystem.out.println(b); // 20int i = 10;int j = 20;System.out.println(i > 2 || ++j > 10); // trueSystem.out.println(j); // 20}
}
三元运算符
语法格式:
执行流程:
- 首先计算关系表达式的值
- 如果值为true, 取表达式1的值
- 如果值为false,取表达式2的值
实例
public class Demo {/*声明三个整型的变量,a,b,c,要求找出最大值*/public static void main(String[] args) {// 1. 定义三个变量用于保存和尚的身高int a = 150;int b = 210;int c = 165;// 2. 用三元运算符 , 比较前两个变量,获取较大值。int tempMax = a > b ? a : b;// 3. 用三元运算符 , 让较大值和第三个变量比较,获取最大值。int max = tempMax > c ? tempMax : c;// 4. 输出结果System.out.println(max); // 210}
}
位运算符(了解)
- 位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果
- 从二进制到十进制都是基于原码
- 正数的原码反码补码都一样,负数原码反码补码不一样
- byte,short,char在计算时按照int类型处理
- 如何区分&,|,^是逻辑运算符还是位运算符? 如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符
详解:
- 左移:<< 左移几位就相当于乘以2的几次方
- 右移:>> 类似于除以2的n次,如果不能整除,向下取整
- 无符号右移:>>> 往右移动后,左边空出来的位直接补0,不看符号位
- 按位与:& 对应位都是1才为1
- 按位或:| 对应位只要有1即为1
- 按位异或:^ 对应位一个为1一个为0,才为1
- 按位取反:~0就是1 ~1就是0
运算符优先级
在表达式中,哪个运算符先执行后执行是要看优先级的,例如 “*、/” 的优先级高于”+、-” 。
实例
public class Demo {public static void main(String[] args) {// 目标:看看Java是否存在优先级,大家以后需要注意优先级问题System.out.println(10 > 3 || 10 > 3 && 10 < 3); //trueSystem.out.println( (10 > 3 || 10 > 3 ) && 10 < 3); // false}
}
tips
- 表达式不要太复杂,如果不能确定优先级先算的使用小括号