运算符分类:
算数运算符 | 一元运算符:++,–二元运算符:+,-,*,/,% |
赋值运算符 | = |
扩展运算符 | +=,-=,*=,/= |
关系运算符 | >,<,>=,<=,==,!= instanceof |
逻辑运算符 | &&,||,!,^ |
位运算符 | &,|,^,~ , >>,<<,>>> |
条件运算符 | ? : |
字符串连接符 | + |
算数运算符
算术运算符中+,-,*,/,%属于二元运算符,二元运算符指的是需要两个操作数才能完成运算的运算符。其中的%是取模运算符,就是我们常说的求余数操作。
二元运算符的运算规则:
整数运算:
- 如果两个操作数有一个为Long, 则结果也为long。
- 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
- 如果两个操作数有一个为double,则结果为double。
- 只有两个操作数都是float,则结果才为float。
取模运算:
其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。
算术运算符中++,--
属于一元运算符,该类运算符只需要一个操作数。
int a = 3;
int b = a++; //执行完后,b=3。先给b赋值,再自增。
System.out.println("a="+a+"\nb="+b);
a = 3;
b = ++a; //执行完后,c=5。a先自增,再给c赋值
System.out.println("a="+a+"\nb="+b)
赋值运算符/扩展运算符
赋值运算符我们已经用了很多次了,这里不再赘述。直接看扩展运算符怎么用。
int a=3;
int b=4;
a+=b;//相当于a=a+b;
System.out.println("a="+a+"\nb="+b);
a=3;
a*=b+3;//相当于a=a*(b+3),先运算后面的。
System.out.println("a="+a+"\nb="+b);
关系运算符
运算符 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
注意事项:
- =是赋值运算符,而真正的判断两个操作数是否相等的运算符是==。
- ==、!= 是所有(基本和引用)数据类型都可以使用
- > 、>=、 <、 <= 仅针对数值类型(byte/short/int/long, float/double。以及char)
逻辑运算符
逻辑运算的操作数和运算结果都是boolean值。
运算符 | 说明 |
---|---|
逻辑与 & | 两个操作数为true,结果才是true,否则是false |
逻辑或| | 两个操作数有一个是true,结果就是true |
短路与&& | 只要有一个为false,则直接返回false |
短路或|| | 只要有一个为true, 则直接返回true |
逻辑非 ! | 取反:!false为true,!true为false |
逻辑异或 ^ | 两个值相同为false,两个值不同为true |
//1>2的结果为false,那么整个表达式的结果即为false,将不再计算2>(3/0)
boolean c = 1>2 && 2>(3/0);
System.out.println(c);
//1>2的结果为false,那么整个表达式的结果即为false,还要计算2>(3/0),0不能做除数,//会输出异常信息
boolean d = 1>2 & 2>(3/0);
System.out.println(d);
字符串连接符
+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
int a = 3;
int b =4;
int d = "5";
a+b+c // 75
c+b+a // 543
条件运算符
x ? y : z
其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个运算的结果为表达式 y 的值,否则整个运算结果为表达式 z 的值。
int score = 80;
int x = -100;
String type =score<60?"不及格":"及格";
int flag = x > 0 ? 1 : (x == 0 ? 0 : -1);
自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如图所示,黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
强制类型转换
强制类型转换,又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
(type)var
int x = 300;
byte bx = (byte)x; //值为44
溢出
int money = 1000000000; //10亿
int years = 20;
//返回的total是负数,超过了int的范围
int total = money*years;
System.out.println("total="+total);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生//了数据丢失
long total1 = money*years;
System.out.println("total1="+total1);
//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
long total2 = money*((long)years);
System.out.println("total2="+total2);