运算符分类--个人记录的复习笔记.希望与大家共同进步
运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
1.按功能分类
1.1算术运算符
运算符 | 描述 | 例子 |
---|---|---|
+ | 双目运算符,对运算符两边的操作数进行相加操作 | 1+1=2 |
- | 双目运算符,对运算符两边的操作数进行相减操作 | 2-1=1 |
* | 双目运算符,对运算符两边的操作数进行相乘操作 | 1*2=2 |
/ | 双目运算符,对运算符两边的操作数进行相除操作 | 2/2=1 |
% | 双目运算符,对运算符两边的操作数进行取余操作 | 10%3=1 |
++ | 单目运算符,对运算符两边的操作数进行相加操作 | ++a a++ |
-- | 单目运算符,对运算符两边的操作数进行相减操作 | a-- --a |
自增(++):将变量的值加1,分前缀式(如++a)和后缀式(如a++)。前缀式是先加1再使用;后缀式是先使用再加1。
自减(--):将变量的值减1,分前缀式(如--a)和后缀式(如a--)。前缀式是先减1再使用;后缀式是先使用再减1。
备注:
++a,a++单独使用时效果相同。(--跟++使用相同)
例:结果都为2
public static void main(String[] args) {
int a = 1;
a++;
System.out.println(a);
}
public static void main(String[] args) {
int a = 1;
++a;
System.out.println(a);
}
++a,a++不单独使用时++a先加后用,a++先用后加(--跟++使用相同)
例:
public static void main(String[] args) {
int a = 1;
a++;
System.out.println(a);
System.out.println(a++);
int b = a;
System.out.println(b);
}
结果输出为2 2 3
public static void main(String[] args) {
int a = 1;
a++;
System.out.println(a);
System.out.println(++a);
int b = a;
System.out.println(b);
}
结果输出为2 3 3
1.2.赋值运算符(双目)
运算符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右边操作数的值赋值简单的赋值运算符,将右边操作数的值赋值 | a=1 a=b+c |
+= | 复合赋值运算符,将左边操作数指定变量值与右边操作数的值相加后,再赋值给左边操作数指定变量 | a+=1等于 a=a+1 |
-= | 复合赋值运算符,将左边操作数指定变量值与右边操作数的值相减后,再赋值给左边操作数指定变量 | a-=1等于 a=a-1 |
*= | 复合赋值运算符,将左边操作数指定变量值与右边操作数的值相乘后,再赋值给左边操作数指定变量 | a*=1等于 a=a*1 |
/= | 复合赋值运算符,将左边操作数指定变量与右边操作数的值相除后,再赋值给左边操作作数指定变量 | a/=1等于 a=a/1 |
%= | 复合赋值运算符,将左边操作数指定变量与右边操作数的值取余后,再赋值给左边操作数指定变量 | a%=1等于 a=a%1 |
1.3关系运算符(双目)
运算符 | 描述 | 例子 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等,则条件为真 | 1==1 |
!= | 检查两个操作数的值是否相等,如果值不相等,则条件为真 | 1!=2 |
> | 检查左操作数是否大于右操作数,如果是,条件为真 | 2>1 |
< | 检查左操作数是否大于右操作数,如果是,条件为真 | 1<2 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是,条件为真 | 2>=2 |
<= | 检查左操作数的值是否小于或者等于右操作数的值,如果是,条件为真 | 2<=3 |
补充知识点:==跟equal()的区别
简单的说
1.==是比较两个值的引用是否相同。equals()是比较两个值是否相同。
2.==是运算符,equals是方法。
3.==相较于equal速度更快
但是需要注意的是:
equals()和==的源码定义:
public boolean equals(Object obj) {
return (this == obj);
}
由equals的源码可以看出这里定义的equals与==是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String、Integer等类)对equals进行了重写。
但是没有对equals进行重写的类就只能从Object类中继承equals方法,其equals方法与==就也是等效的,除非在此类中重写equals。
1.4.逻辑运算符
运算符 | 描述 | 例子 |
---|---|---|
& | 逻辑与 | A&B为假 |
&& | 短路与 | A&&B为假 |
| | 逻辑或 | A|B为真 |
|| | 短路或 | A||B为真 |
! | 逻辑非 | !(A&B)为真 |
补充:&(逻辑与)跟&&(短路与)区别
1.当&(逻辑与)运算符两边的表达式的结果都为true时,整个运算结果才为true。而&&(短路与)运算符第一个表达式为false时,则结果为false,不再计算第二个表达式。
2.&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如:0x31 & 0x0f的结果为0x01。
2.按操作数目分类
2.1.单目:
~(按位取反)、! (取非)、-(负号运算符)、 ++(自增)、 - -(自减)
2.2.双目:
大部分都是双目
2.3.三目:
a>b?true:false 说明:当a大于b的时候,为true(也就是冒号之前的值),否则为false;
补充:
1.运算符综述
Java 的表达式就是用运算符连接起来的符合Java 规则的式子.运算符的优先级决定了表达式中运算执行的先后顺序.例如,x<y&&!z相当于(x<y)&&(!z),没有必要去记忆运算符号的优先级别,在编写程序时可尽量的使用括号来实现你想要的运算次序,以免产生难以阅读或含糊不清的计算顺序.运算符的结合性决定了并列相同级别的运算符的先后顺序,例如,加减的结合性是从左到右,8-5+3 相当于(8-5)+3.逻辑否运算符 的结合性是右到左, x 相当于!(!x).表3.4是Java所有运算符的优先级和结合性。
2.运算符优先级
按优先级从高到低排列如下:[ ] ( ) ++ -- ! ~ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op= 。
3.instanceof
该运算符是双目运算符,左面的操作元是一个对象,右面是一个类或接口。当左面的对象是右面的类(或右边类的子孙类)创建的对象、或者是右边接口的实现类(或实现类的子孙类)的对象时,该运算符运算结果是true,否则是false。