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。
public class Test1 {
public static void main(String a[ ]) {
int m =4;
System.out.println("result1="+m++);
System.out.println("result2="+(++m));
boolean x = (m>=6) && (m%2==0);
System.out.println("result3="+x);
}
}
运行结果:
result1=4
result2=6
result3=true
public class Test1 {
public static void main(String[] args) {
int x=5;
if(x=0)
System.out.println("false");
else
System.out.println("ture");
}
}
编译错误!原因:if条件只接受boolean类型的值(true或false),
x=0是int类型不能隐式地转换为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,计算各运算结果。
首先,将数据转换为二进制形式: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
- 其功能是先将左边变量与右边的表达式进行某种运算后,再把运算的结果赋给变量。
- 能与赋值符结合的运算符包括:
- 算术运算符:+,-,*,/,%
- 位运算符: &,|,^
- 位移运算符:>>,<<,>>>
- 复合赋值运算符隐含强制类型转换
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 | 右 |
♣ 表达式的运算次序
- 优先级值大的运算先计算;
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) ”