运算符与自动类型转换
1. 算数运算符
(1)算术运算符
- 运算符和表达式
运算符:对常量或变量进行操作的符号;
表达式:用运算符把常量或变量连接起来的符合Java语法的式子就可
int a = 10 ;
int b = 20;
int c = a + b ;
//其中+是算数运算符
//故a+b是算数表达式
- 算数运算符
符号 | 作用 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余(模) |
(2) 字符的+操作
char类型参与算数运算使用的是计算机底层对应的十进制数
我们需要记住这三个字符所对应的数值
'a’对应数字97,a~z是连续的,故’b’对应98,'c’对应99,以此类推;
'A’对应数字65,A~Z是连续的,故’B’对应66, 'C’对应67,以此类推;
'0’对应数字48,0~9是连续的,故’1’对应49 , '2’对应50,以此类推;
(3)字符串的+操作
当字符串中出现“+”符号时,表示的是连接符号而不是算术运算符
eg:
System.out.println("age"+60);//输出age60
System.out.println(1+2+3+"LOVE")//输出6LOVE
System.out.println(1+2+"age"+3+4);//输出3age34
//可以使用小括号改变运算的优先级
System.out.println(1+2+"age"+(3+4));//输出3age7
2.数据类型转换
算数表达式中包含不同的基本数据类型的值的时候,整个算术表达式的类型会自动提升,提升规则如下:
byte类型,short类型,char类型将被自动提升到int类型不管是否有其他类型参与运算。
整个表达式的类型自动提升到与表达式中最高等级的操作数相同的类型
等级顺序:
byte,short,char–>int–>long–>float–>double
eg:
byte a = 10 ;
byte b = 20 ;
byte c = a + b ;//该行为报错,byte类型参与运算自动提升为int类型
//将int类型赋值给byte类型可能使精度损失。
int i = a + b ;//用int接受正确
//也可这样写“byte c = (byte) a + b ; ”使用强制转换
正因为上述原因所以我们很少使用byte,short,类型定义整数,也很少使用char类型定义字符
3.赋值运算符
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | a=10;将10赋值给a |
+= | 加后赋值 | a+=b;相当于a=a+b;将a+b赋值给a |
-= | 减后赋值 | a-=b;相当于a=a-b;将a-b赋值给a |
*= | 乘后赋值 | a*=b;相当于a=ab;将ab赋值给a |
/= | 除后赋值 | a/=b;相当于a=a/b;将a/b赋值给a |
%= | 取余后赋值 | a%=b;相当于a=a%b;将a%b赋值给a |
- 赋值运算符隐含了强制类型转换
eg:
short a = 10 ;
a = a + 10 ;//本行报错,运算中a被提升为int类型,
//将int类型赋值给short类型可能损失精度;
a+=10;//本行正确,隐含了强制转换,等同于a= (short)(a+10);
4.自增自减运算
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量值加一 |
- - | 自减 | 变量值减一 |
- ++,- -既可放于变量前也可放于变量后
- 单独使用时,放于前或后都没有影响
- 参与操作时,若放于变量前边先拿变量做++或- -,再拿变量参与操作(比如赋值)。
- 参与操作时,若放于变量后边先拿变量参与操作,在做自增或自减。
eg:
int a = 10 ;
int b = a++ ;//++在后面,先将a(a=10)赋值给b,然后a本身再加1;即a=11,b=10
System.out.println(b);//输出10
int x = 10 ;
int y = ++x ;//++在前面,x本身先加1,再赋值给b
System.out.println("x="+x+",y="+y);//输出x=11,y=11
5.关系运算符
符号 | 说明 |
---|---|
== | 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
6.逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
& | 与 | a&b,a和b都为true,结果为true,否则为false |
1 | 或 | a1b,a和b都为false,结果为false,否则为true(或符号就是一条竖线) |
^ | 异或 | a^b,a和b结果不同为true,相同为false |
! | 非 | !a,结果正好与a相反为true,否则为false |
7.短逻辑运算符
-
符号:&&
作用:与
说明:作用与&相同,但有短路效果 -
符号:||
作用:或
说明:作用与|相同,但有短逻辑效果
注意
- 逻辑&,无论左边真假右边都要执行
- 逻辑&&,若左边为true,右边执行,若左边为false,右边不执行
- 逻辑|,无论左边真假右边都要执行
- 逻辑||,若左边为false,右边执行,若左边为true,右边不执行
8.三目运算符
-
语法:关系表达式?表达式1:表达式2;
-
?前为判断条件,判断结果为boolean类型
为true时调用表达式1,为false时调用表达式2 -
关系表达式成立时执行表达式1,否则执行表达式2
eg:
int a = 10 ;
int b = 20;
int c = a > b ? a : b ;//判断a>b是否为真,为真取a值,为假取b值
System.out.println(c);//输出20