运算符
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符(不常用)
- 三元运算符
算术运算符
+
正号 -
负号
+
-
*
/
%
++
自增 分为++a
和 a++
--
自减 分为--a
和 a--
+
字符串连接符
注意
- 除法运算
/
int result = 12 / 5; // result = 2
int result = 12 / 5 * 2; //result = 10
double result = 12 / 5 + 0.0; //result = 2.0
double result = (double)(12 / 5); //result = 2.0
double result = (double)12 / 5; //reslut = 2.4
double result = 12 / (5 + 0.0); //result = 2.4
- 取模运算
%
int result = 12 % 5;// result = 2
int result = -12 % 5;// result = -2
int result = 12 % -5;// result = 2
int result = -12 % -5;// result = -2
结论:
取模运算结果的符号与被模数的符号相同。被模数是正号,结果为正号,被模数为负号,结果为负号。
- 在编程过程中,如果想要给byte,short,char类型变量
+1
或者-1
,最好使用++
或者--
。因为++
或者--
运算不会改变变量本身的数据类型。
short a = 10;
a = a + 1; //错误,返回结果为int类型,把int类型的值赋给short类型的变量会报错报错,编译不通过
++a; //正确 a = 11
特例:
byte b1 = 127;
++b1; // b1 = -128 这个可以根据底层的01存储分析可得,注意计算机底层使用**补码**的方式对数值存储的
简单分析题:
int n = 10;
n += (n++) + (++n);
n 的结果是 32;
分析:上述可以理解为
n = n + (n++) + (++n);
n = 10 + 10(此处n把10返回,然后自增1, n = 11) + 12(先增1, 然后再返回n = 12);
n = 10 + 10 + 12; // 32
赋值运算符
=
+=
-=
*=
/=
%=
注意
- 当
=
两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。 - 支持连续赋值。举例:
i = j = 10;
int i = j = 10; - 上述6种赋值运算符,都不会改变变量本身的数据类型。
short b1 = 10;
b1 += 10;
b1 = b1 + 10;//右侧返回结果为int型,int型不能赋值为short型变量。
关系运算符
>
<
==
!=
>=
<=
instanceof
结论:
- 比较运算符的结果都是boolean类型,要么为true,要么为false;
>
<
>=
<=
: 只能使用在数值型的数据之间做关系运算。==
和!=
:不仅可以使用在数值型数据 变量之间,还可以使用在其他引用类型变量之间。
注意:
==
不要误写成=
;
逻辑运算符
&
&&
|
||
!
^
(异或)
注意:
-
&
和&&
:
&
左边无论真假,右边都进行运算。
&&
如果左边为真,右边参与运算,如果左边为假,右边不参与运算。(惰性)- 不论是
&
和&&
两者的运算结果都相同。 - 当
&
或者&&
左边为true
时,右边都参与运算。
- 不论是
&
和&&
的不同点: 当运算符左侧为false时,&
会继续执行符号右侧的运算,&&
不会执行符号右侧的运算,直接短路。
|
和||
:
|
左边无论真假,右边都进行运算。
||
如果左边为假,右边参与运算,如果左边为真,右边不参与运算。(惰性)- 不论是
|
和||
两者的运算结果都相同。 - 当
|
或者||
左边为false
时,右边都参与运算。
- 不论是
|
和||
的不同点:当符号左侧为true时,|
会继续执行符号右侧的运算,||
不会执行符号右侧的运算,直接短路。
位运算符
>>
<<
>>>
&
|
~
(位非) ^
(位异或)
总结:
- 位运算符的操作对象都是整型变量或者常量。
<<
在一定范围内,每向左移1位,相当于乘2,空位拿0
填充。>>
在一定范围内,每向右移1位,相当于除2,空位拿符号位
填充。>>>
: 无符号右移,空位拿0
填充。&
|
~
^
这几个位运算符在运算过程中,也会对符号位进行操作。
注意:
如何区分&
为逻辑运算符还是位运算符?
&
如果符号两侧运算符是boolean对象,则该运算符是逻辑运算符;
&
如果符号两侧运算符对象是整型变量或者常量对象,则该运算符为位运算符。
三元运算符
判断条件 ? 表达式1 : 表达式2
判断条件为true时,执行表达式1;
判断条件为false时,执行表达式2;
总结:
- 三元运算符可以嵌套使用。
- 三元运算符结构的程序一定可改写为
if-else
结构,但是if-else
结构不一定能改写为三元运算符结构。 - 如果程序既可以使用三元运算符,又可以使用if-else结构,那么直接使用三元运算符。简洁,运算效率高。
注意:
int max = 1 > 2 ? 1 : 2; //正确
1 > 2 ? 1 : 2; //错误。必须将结果赋给某个对象。这也是为什么if-else不一定能改写为三元运算符的原因。
举例:
1 > 2 ? 1 : "2大"; //三元运算符不成立。返回结果没有办法赋值给统一的一个对象。
运算符优先级
没有必要刻意背诵优先级关系,如果在编程过程中不确定运算符好的优先级关系,可以使用
()
来改变运算顺序。