运算符虽然可以根据运算数的个数分为一目运算符、二目运算符、三目运算法。但是个人认为从实际上根据运算符的属性进行分类可能是更好的选择。
一、算术运算符
算术运算符 | 名称 | 举例 |
---|---|---|
+ | 加法 | 1+1=2 |
- | 减法 | 15-5=10 |
* | 乘法 | 3*6=18 |
/ | 除法 | 36/4=9 |
% | 求余数(求模) | 13%3=1 |
++ | 自增1 | int n=1;n++;++n; |
– | 自减1 | int n=10;n–;--n; |
PS.
-
在除法运算中,如果除数与被除数都是整数,做整除运算。
-
n++与++n的区别在于n++是先运算后赋值,而++n则是先赋值后运算。
int n; int x; // n++运算 n = 0; x = 0; /* 可以拆分为下列表达式 * x = x + n; 先运算 * n = n + 1; 后赋值 * */ x = x + (n++); System.out.println("x=" + x); // x=0 System.out.println("n=" + n); // n=1 // ++n运算 n = 0; x = 0; /* 可以拆分为下列表达式 * n = n + 1; 先赋值 * x = x + n; 后运算 * */ x = x + (++n); System.out.println("x=" + x); // x=1 System.out.println("n=" + n); // n=1
二、赋值运算符
赋值运算符 | 名称 | 举例 |
---|---|---|
= | 赋值 | int n=1; |
+= | 加等于 | int n=0; n+=1; |
-= | 减等于 | int n=0; n-=1; |
*= | 乘等于 | int n=1; n*=3; |
/= | 除等于 | int n=100; n/=5; |
%= | 取模等于 | int n=100; n%=3; |
三、关系运算符
关系运算符 | 名称 | 表达式 | 结果 |
---|---|---|---|
> | 大于 | 5>3 | true |
< | 小于 | 5>3 | false |
>= | 大于等于 | 5>=3 | true |
<= | 小于等于 | 5<=3 | false |
== | 等于 | 5==3 | false |
!= | 不等于 | 5!=3 | true |
PS. 基本数据类型使用==来判定两个值是否相等,但引用数据类型通常重写equals()方法进行相等判断。
四、逻辑运算符
逻辑运算符 | 名称 | 表达式 |
---|---|---|
&& 或 & | 与 | n1 && n2; |
|| 或 | | 或 | n1 || n2 |
! | 非 | !n |
PS. && 与 & 的区别在于符号的两侧是否一定会执行。
boolean flagTrue = true;
boolean flagFalse = false;
/* false,两者的结果虽然相同,但是它们的运算规则不同
* & 运算需要对两侧都进行运算,如果左侧为false,还需要对右侧进行判定后再返回false
* && 运算如果左侧为false,则不对右侧进行判定,直接返回false
*/
boolean flag1 = flagFalse & flagTrue; // 右侧一定执行
boolean flag2 = flagFalse && flagTrue; // 右侧不一定执行
五、条件运算符
条件运算符 | 名称 | 表达式 | 结果 |
---|---|---|---|
布尔表达式?表达式1:表达式2 | 5>3?5:3 | 5 |
PS. 根据布尔表达式的值执行对应的表达式,如果为真,执行表达式1,反之则执行表达式2,执行表达式1或表达式2可以得到确定的返回值。
六、位运算符
位运算符 | 名称 | 表达式 | 结果 |
---|---|---|---|
<< | 左移 | 5<<2 | 20 |
>> | 右移 | 5>>2 | 1 |
>>> | 无符号右移 | 5>>>3 | 0 |
& | 位与 | 5&3 | 1 |
| | 位或 | 5|3 | 7 |
^ | 位异或 | 5^3 | 6 |
~ | 位非 | ~5 | -6 |
PS.
- 位运算的本质是将运算数转换成二进制后再进行相应的运算。
- 根据位运算符可衍生出新的赋值运算符如:&=,|=,^=,>>=,<<=,>>>=等等。