运算符
算术运算符
算数运算符
-
加: +
-
减:-
-
乘:*
-
除:/
-
取模,取余:%
注意
-
/取的是结果的商,%取得结果的余数
-
在小数运算的结果中可能计算结果会出现误差,是因为小数在计算机中的存储方式导致
数字在运算时,数据类型不一致不能运算,需要转换一样的
-
隐式转换(自动类型提升)
int a = 10; double b = a;(自动将a提升到double类型) byte a = 10; byte b = 20; ? c = a + b; (int类型)
1. byte,short,char三种类型在运算时都会直接先提升到int,然后再进行运算
2. 取值范围由小到大:byte>short>int>long>float>double
3. 取值范围小的数值转换成大的
4. 数据类型不一致,不能进行运算,需要转成一样的才能进行
-
强制转换
取值范围大的转换成小的
格式: 目标数据类型 变量名 = (目标数据类型)被强制转换的数据;
int a = 300 ; double b = (byte) a ;
注意强制转换类型,需注意转换范围。比如:byte类型范围是-128-127,超出范围转换i出错
int a = 10; int b = 20; byte c = (byte)(a + b);
字符串的“+”操作
“+”操作中出现字符串,+是字符串的连接符号而不是算术运算符
"123" + 123 输出的时候不是246而是 "123123"
连续+的操作时,从左到右逐个执行
注: 1 + 99 + "年红酒" 输出时则是"100年红酒" 注: 1 + 2 + "abc" + 2 + 1 输出的是"3abc21"
字符+操作
将字符转换成ASCLL码值进行运算
System.out.println(1 + 'a') 输出结果为:98
A的ASCLL码值为65,a的ASCLL码值是97;
自增自减
基本用法
符号 | 作用 | 说明 |
---|---|---|
++ | 加 | 变量的值加1 |
-- | 减 | 变量的值减1 |
理解自增(减)前和自增(减)后
int a = 1 ; System.out.println(a++); 输出的值为:2 System.out.println(++a); 输出的值为:2 System.out.println(a--); 输出的值为:0 System.out.println(--a); 输出的值为:0
int b = 10; int c = b++; c输出结果为:10 将自增前的值赋给c
int a = 10 ; int c = ++a; c输出结果为:11 将自增后的值给c
赋值运算符
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | int a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值费给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a*=b,将a×b的值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a |
%= | 取余后赋值 | a%=b,将a÷b的余数给a |
注意:
+=,-=,*=,/=,%=底层都隐藏了一个强制类型转换
short i = 1; i += 1; //等同于 i = (short)(i+1) System.out.println(i); 输出的i任然是short类型的
关系运算符
符号 | 说明 |
---|---|
== | a==b,判断a和b是否相等,成立true,不成立false |
!= | a!=b,判断a和b的值是否不等,成立true,不成立false |
> | a>b,判断a是否大于b,成立true,不成立false |
>= | a>=b,判断是否a>=b,成立true,不成立false |
< | a<b,判断a是否小于b,成立true,不成立false |
<= | a<=b,判断a是否小于等于b,成立true,不成立false |
注意:关系运算符的结果都是boolean类型,要么true要么false
逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与(且) | 并且,两边都是真,结果才为真 |
| | 逻辑或 | 或者,两边都为假才为假 |
^ | 逻辑异或 | 相同为false,不同为true |
! | 逻辑非 | 取反 |
短路逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 结果与&相同,但是有短路效果 |
|| | 短路或 | 结果和|相同,但是有短路效果 |
比如在输入账户和密码时,账户和密码都需要进行匹配正确才能登陆。运用短路运算符在判断账户不正确时就可直接判断错误
int a = 10 ; int b = 10; boolean result = ++a < 5 && ++b < 5; System.out.println(result); System.out.println(a); System.out.println(b); 在result = ++a < 5 && ++b < 5中 ++a<5 就已经是false了所以后面的 ++b<5 就不会进行了。最后输出result为false,a为11,b为10
简单理解:当左边的表达式能出现最终结果时右边的表达式就不在参与运行了
单个& | 无论结果两边都需要运行
三元运算符
格式: 关系表达式? 表达式1:表达式2;
-
整个三元运算符的结果必须要被使用,及要么打印出或赋值给其他的变量
-
运行时先运行关系表达式如果为真就运行表达式1,假就运行表达式2
求两个数的较大值 a > b ? a : b;
运算符优先级
优先级 | 运算符 |
---|---|
1 | . (){} |
2 | !,-,++,-- |
3 | *,/,% |
4 | +,- |
5 | <<,>>,>>> |
6 | <,<=,>,>=,instanceof |
7 | ==,!= |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ?: |
14 | =,+=,-=,*=,/=,%=,&= |