2021-03-10
Day 4, 学习运算符Operators
Operators一览
运算符包含简单的加减乘除,还有其他逻辑运算。我们称被运算的值,比如1+2的1和2为运算对象operand,Java有着以下的运算符
Operators | Precedence ↑ |
---|---|
postfix | expr++ expr-- |
unary | ++expr --expr +expr -expr ~ ! |
multiplicative | * / % |
additive | + - |
shift | << >> >>> |
relational | < > <= >= instanceof |
equality | == != |
bitwise AND | & |
bitwise exlusive OR | ^ |
bitwise inclusive OR | | |
logical AND | && |
logical OR | || |
ternary | ? : |
assignment | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
#表格位置越高的运算符有着越高的优先级
赋值运算符 =
最常用的运算符应该就是=
了,赋值运算符将右边的值赋给左边的operand或创建类的对象
int cadence = 0;
int speed = 0;
Point originOne = new Point(23, 94);
算数运算符 + - * / %
即加+
减-
乘*
除/
和求余运算符%
,和数学意义上的运算符一样。以下为不同点
- 加法运算符也可用于连接字符串concatenation
- 求余运算符将求两个数字相除后所得的余数
与python不同,乘法运算符不能作用在字符串上。
复合赋值
可以将赋值运算符和算数运算符结合来创造复合赋值运算符
比如x = x + 1
与x += 1
的效果都是将x的值加一
单元运算符
单元运算符Unary Operator只需要一个值即可完成运算
Operators | Description |
---|---|
+ | 单元加法符,指定正数(虽然不需要也是正数) |
- | 单元减法符, 否定negate一个表达式 |
++ | 增量运算符,将值加1 |
- - | 减量运算符,将值减一 |
! | 逻辑算符Logical complement operator,将布尔值颠倒 |
用法如下
int number = +1 //-1
number-- //0
number++ //1
number = -number // -1
boolean correct = true
System.out.println(!correct) //false
注意,增量/减量运算符可以放在前或后如--number
与 number--
,并且有区别:
number = 1
System.out.println(number--) //将打印出1
System.out.println(number) //将打印出0
System.out.println(--number) //将打印出-1
System.out.println(number) //将打印出-1
将运算符放在前面如--number
++number
会运算出赋值后的值,而放在后面number--
number++
会算出赋值前的值。
不过不论将运算符放在前或后,都会将值加或减,唯一的区别便是算式本身可算出evaluate的值。
关系操作符
关系操作符判断一个值比另一个值是大,小还是相等
Operators | Description |
---|---|
== | 相等 |
!= | 不等 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
>= | 小于或等于 |
没什么特殊的,不多讲
条件运算符
用于布尔值运算,&&
和 ||
‘
&&
类似物理的或门,当两个布尔值均为true时为true
||
类似物理的与门,两个布尔值其中一个为true便为true
还有一个三元条件运算符?
,可以记为简短的if-then-else结构。
class Conditional {
public static void main(String[] args){
int value1 = 1;
int value2 = 2;
int result;
boolean someCondition = true;
result = someCondition ? value1 : value2;
System.out.println(result);
}
}
在以上代码内,?
所起到的作用大概是:
“如果someCondition
”是true,把value1
的值赋给result
, 如果不是就将value2
的值赋给result
"
类型比较符 instanceof
用于判断某个对象是否为某个类的实例,也可用于判断某个对象是否为完成了接口的类的实例
class InstanceofDemo {
public static void main(String[] args) {
Parent obj1 = new Parent();
Parent obj2 = new Child();
System.out.println("obj1 instanceof Parent: "
+ (obj1 instanceof Parent));
System.out.println("obj1 instanceof Child: "
+ (obj1 instanceof Child));
System.out.println("obj1 instanceof MyInterface: "
+ (obj1 instanceof MyInterface));
System.out.println("obj2 instanceof Parent: "
+ (obj2 instanceof Parent));
System.out.println("obj2 instanceof Child: "
+ (obj2 instanceof Child));
System.out.println("obj2 instanceof MyInterface: "
+ (obj2 instanceof MyInterface));
}
}
class Parent {}
class Child extends Parent implements MyInterface {}
interface MyInterface {}
在以上代码,我们定义了
- 一个
Parent
类 - 一个简单的
MyInterface
接口 - 一个继承了
Parent
并且完成了接口MyInterface
的Child
类
运行后的结果为:
obj1 instanceof Parent: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
obj2 instanceof MyInterface: true
位运算符
位运算符bitwsie operator和位移运算符bit shift operator使用的是二进制的计算方法
& 与
&
为与门,运算时两个二进制操作数的对应位需都为1,结果位为1
18 & 21
的运算结果为16,方法如下
18 | 21 | 16 |
---|---|---|
1 | 1 | 1 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
| 或
|
为或门,运算时两个二进制操作数的对应位其中一个为1,结果位为1
18 | 21
的运算结果为23,方法如下
18 | 21 | 23 |
---|---|---|
1 | 1 | 1 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
~ 非
~
为非,将一个数字取反,把0变成1,1变成0。得到取反后的二进制值后计算反码的补码,此处涉及到了原码,反码和补码的概念,下篇会具体讲,暂时搁置
^ 异或
^
可以看作异或门,当两个二进制操作数对应值相同则为0,不相同则为1
18 ^ 21
的运算结果为7,方法如下
18 | 21 | 7 |
---|---|---|
1 | 1 | 0 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
<< 左移运算符
<<
将会把数字按照二进制形式往左移对应的位数,高位的将一处,低位补上0
假设我的电脑支持一字节的数字,则18<<2
会运算出72
18 | 72 |
---|---|
0 | 0 |
0 | 1 |
0 | 0 |
1 | 0 |
0 | 1 |
0 | 0 |
1 | 0 |
0 | 0 |
>> 右移运算符
>>
将会把数字按照二进制形式往右移对应的位数,低位的移除,高位补上0,负数高位补1 (具体见后续文章)
假设我的电脑支持一字节的数字,则18>>2
会运算出4
18 | 4 |
---|---|
0 | 0 |
0 | 0 |
0 | 0 |
1 | 0 |
0 | 0 |
0 | 1 |
1 | 0 |
0 | 0 |
Reference
Java Tutorial
计算机补码,反码,原码