2.3.1、运算符按操作数的数目分类

  • 一元运算符:只需要一个运算对象的运算符称为一元运算符。 例:x= -x ;
  • 二元运算符:需要两个运算对象的运算符号称为双元操纵符。 例:x= x+2;
  • 三元运算符:三元运算符需要三个运算对象。

    Java有一个三元运算符“ (A>B)?A :B ”,它是一个简要的if……else语句。

    1. 算术运算符

    (1) 双目算术运算符

    | 运算符 | 使用形式 | 描述 | 举例 | 结果 | | —- | —- | —- | —- | —- | | + | op1 + op2 | op1 加上op2 | 5+6 | 11 | | - | op1 - op2 | op1 减去op2 | 6.2-2 | 4.2 | | | op1 op2 | op1乘以op2 | 3*4 | 12 | | / | op1 / op2 | op1 除以op2 | 7/2 | 3 | | % | op1 % op2 | op1 除以op2的余数 | 9%2 | 1 |

几点注意:
1) “/”运算对与整数和浮点数情况不同,7/2结果为3,而7.0/2.0结果为3.5。
2) 取模运算“%”一般用于整数运算,它是用来得到余数部分。当参与运算的量为负数时,结果的正负性取决与被除数的正负
3)如果出现各种类型数据的混合运算,系统将按自动转换原则将操作数转化为同一类型,再进行运算。如:一个整数和一个浮点数进行运算,结果为浮点型。字符与整数的混合运算,字符转换为整数。

2. 单目算术运算符

运算符 使用形式 描述 功能等价
++ a++或++a 自增 a=a+1
a—或—a 自减 a=a-1
- -a 求相反数 a=-a

几点说明:
★ 变量的自增与++出现的前后位置无关。
无论是++x还是x++均表示x的值要增加1。
★ 表达式的值与运算符位置有关。
表达式 x++的值为x增之前的值,++x的值为x增之后的值。

2.3.2 关系运算

———-结果是布尔值(true或false)

运算符 用法 描述 举例
> op1 > op2 op1大于op2 x>3
>= op1 >= op2 op1大于等于op2 x>=4
< op1 < op2 op1小于op2 x <3
<= op1 <= op2 op1小于等于op2 x <=4
== op1 == op2 op1等于op2 x ==2
!= op1 != op2 op1不等于op2 x!=1

2.3.3 Java逻辑运算符

运算符 用法 何时结果为true 附加特点
&& op1 && op2 op1 和 op2都是true op1为false时,不计算op2
|| op1 || op2 op1 或 op2是true op1为true时,不计算op2
! ! op op为false

设x=3,执行下面语句结果为true。
System.out.println((x==3)||(x/0>2));
如果将代码改为:
System.out.println((x/0>2)||(x==3)); 则运行时将产生算术运算异常,不能用x去除0。

  1. public class Test1 {
  2. public static void main(String a[ ]) {
  3. int m =4;
  4. System.out.println("result1="+m++);
  5. System.out.println("result2="+(++m));
  6. boolean x = (m>=6) && (m%2==0);
  7. System.out.println("result3="+x);
  8. }
  9. }
  10. 运行结果:
  11. result1=4
  12. result2=6
  13. result3=true
  14. public class Test1 {
  15. public static void main(String[] args) {
  16. int x=5;
  17. if(x=0)
  18. System.out.println("false");
  19. else
  20. System.out.println("ture");
  21. }
  22. }
  23. 编译错误!原因:if条件只接受boolean类型的值(truefalse),
  24. x=0int类型不能隐式地转换为boolean类型。

2.3.4 位运算

——-是对操作数以二进制比特(bit)位为单位进行的操作运算

运算符 用法 操作
~ ~op 结果是op按比特位求反
>> Op1 >> op2 将op1右移op2个位(带符号)
<< Op1 << op2 将op1左移op2个位(带符号)
>>> op1 >>> op2 将op1右移op2个位(不带符号的右移)
& Op1 & op2 op1 和 op2都是true
| Op1 | op2 op1 或 op2是true
^ Op1 ^ op2 op1和op2是不同值

&、|、^ 也可用于布尔类型数据

(1) 移位运算符——使用示例

x(十进制表示) 二进制补码表示 x<<2 x>>2 x>>>2
30 00011110 01111000 00000111 00000111
-17 11101111 10111100 11111011 00111011
  • 数据在计算机内是以二进制补码的形式存储,正负数的区别看最高位:0代表正数;1则为负数
  • 在处理带符号的右移中,右移后左边的留出的空位上复制的原数的符号位。而不带符号的右移中,右移后左边的空位一律填0。带符号的左移在后边填补0。

    (2) 按位逻辑运算

    假设,x=13,y=43,计算各运算结果。
    image.png
    首先,将数据转换为二进制形式:x为1101,y为101011 以byte型数据为例,x和y均占用一个字节,所以x和y的二进制为:x是00001101, y是00101011
    x&y=00001001,也即十进制的9
    ~x结果应为11110010,十进制结果为-14。

    2.3.5 赋值复合运算符

  • 是指在赋值运算符的左边有一个其它运算符

例如:x+=2; //相当与 x=x+2

  • 其功能是先将左边变量与右边的表达式进行某种运算后,再把运算的结果赋给变量。
  • 能与赋值符结合的运算符包括:
    • 算术运算符:+,-,*,/,%
    • 位运算符: &,|,^
    • 位移运算符:>>,<<,>>>
  • 复合赋值运算符隐含强制类型转换
    • int x=1; x+=3.5;(√) x=x+3.5;(×)

      2.3.6 其他运算符

      | 运算符 | 描述 | | —- | —- | | ?: | 作用相当于if-else语句 | | [] | 用于声明数组,创建数组以及访问数组元素 | | . | 用于访问对象实例或者类的类成员 | | ( type ) | 强制类型转换 | | new | 创建一个新的对象或者新的数组 | | instanceof | 判断对象是否为类的实例 |

2.3.7 Java运算符的优先级与结合性

运算符 描述 优先级 结合性
() 圆括号 15
new 创建对象 15
[] 数组下标运算 15
. 访问成员(属性、方法) 15
++,— 后缀自增、自减1 14
++,— 前缀自增、自减1 13
~ 按位取反 13
逻辑非 13
-、+ 算术符号(负、正号) 13
(type) 强制类型转换 13
*、/、% 乘、除、取模 12
+、- 加、减 11
<<、>>、>>> 移位 10
< 、>、<=、>=
instanceof
关系运算 9
==、!= 相等性运算 8
& 位逻辑与 7
^ 位逻辑异或 6
| 位逻辑或 5
&& 逻辑与 4
|| 逻辑或 3
?: 条件运算符 2
= += -= *= /=
%= &= ^= |=
<<= >>= >>>=
赋值运算符 1

♣ 表达式的运算次序

  1. 优先级值大的运算先计算;
    x>y&&x<5 相当于(x>y)&&(x<5)
    2. 优先级相同,则运算次序取决于结合性.
    左结合就是按由左向右的次序计算表达式
    例如, 47%3
    *右结合
    就是按由右到左的次序计算。
    例如:a=b=c相当于“a=(b=c)” 再如,a?b:c?d:e 相当于“a?b:(c?d:e) ”