系列文章目录
1.Java学习之旅启航~【超详细】
2.Java学习之旅——数据类型与变量【超详细】
3.Java学习之旅——运算符篇
文章目录
目录
一、什么是运算符
运算符即对操作数进行操作时的符号,不同运算符操作的含义不同。
作为一门计算机语言,
Java
也提供了一套丰富的运算符来操纵变量。
Java
中运算符可分为以下:算术运算符
(+ - * /)、关系运算符
(< > ==)
、逻辑运算符、位运算符、移位运算符以及条件运算符等。
二、算术运算符
1.基本四则运算符:加减乘除模(+ - * / %)
这些四则运算符,我们在C语言中已经学过了,就不再细致讲解,直接看代码吧。如果,都可以算出正确的输出结果,那这一块也就过关啦~
public class Test {
public static void main(String[] args) {
System.out.println(5/2);
System.out.println((float) 5/2);
System.out.println(5/(float)2);
System.out.println((float) (5/2));
}}
输出结果:
public class Test {
public static void main(String[] args) {
System.out.println(10%3);
System.out.println(10%-3);
System.out.println(-10%3);
System.out.println(-10%-3);
}
}
输出结果:
【注意点】
1.都是二元运算符,使用时必须要有左右两个操作数
2.做除法和取模时,右操作数不能为0
3.%不仅可以对整形取模,也可以对double类型取模,但是没有意义,一般都是对整形取模的。
4.两操作数类型不一致时,向类型大的提升
2.增量运算符+= -= *= %=
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
注意:只有变量才能使用该运算符,常量不能使用。
3.自增、自减运算符++ --
++是给变量的值+1,--是给变量的值-1。
如果对输出结果没有疑虑,就是已经过关了~
public class Test {
public static void main(String[] args) {
int a=1;
System.out.println(a++);//输出结果1
System.out.println(++a);//输出结果3
int b=1;
System.out.println(--b);//输出结果0
System.out.println(b--);//输出结果0
}
}
【注意点】
1.如果单独使用,【前置
++
】和【后置
++
】没有任何区别
2.如果混合使用,【前置
++
】先
+1
,然后使用变量
+1
之后的值,【后置
++
】先使用变量原来的值,表达式 结束时给变量+1
3.只有变量才能使用自增
/
自减运算符,常量不能使用,因为常量不允许被修改
三.关系运算符
关系运算符主要有六个
:
== != < > <= >=
,其计算结果是
true
或者
false
。
例:
public class Test {
public static void main(String[] args) {
int a=1;
int b=2;
System.out.println(a>b);//输出结果:false
System.out.println(a<b);//输出结果:true
}
}
注意:当需要多次判断时,不能连着写,比如:
3 < a < 5。
四.逻辑运算符(重点)
1.
逻辑与
&&
语法规则:表达式
1 &&
表达式
2
,左右表达式必须是
boolean
类型的结果。
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2); // 左为真 且 右为真 则结果为真
System.out.println(a == 1 && b > 100); // 左为真 但 右为假 则结果为假
System.out.println(a > 100 && b == 2); // 左为假 但 右为真 则结果为假
System.out.println(a > 100 && b > 100); // 左为假 且 右为假 则结果为假
}
}
2.
逻辑
||
语法规则:表达式
1 ||
表达式
2
,左右表达式必须是
boolean
类型的结果。
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2); // 左为真 且 右为真 则结果为真
System.out.println(a == 1 || b > 100); // 左为真 但 右为假 则结果也为真
System.out.println(a > 100 || b == 2); // 左为假 但 右为真 则结果也为真
System.out.println(a > 100 || b > 100); // 左为假 且 右为假 则结果为假
}
}
注意:左右表达式至少有一个位真,则结果为真。
3.
逻辑非
!
语法规则:
!
表达式
真变假,假变真。
public class Test {
public static void main(String[] args) {
int a = 1;
System.out.println(!(a == 1)); // a == 1 为true,取个非就是false
System.out.println(!(a != 1)); // a != 1 为false,取个非就是true
}
}
4.
短路求值
&&
和
||
遵守短路求值的规则。
public class Test {
public static void main(String[] args) {
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常
}
}
我们都知道
,
计算
10 / 0
会导致程序抛出异常
.
但是上面的代码却能正常运行
,
说明
10 / 0
并没有真正被求值。
注意
:
对于
&& ,
如果
左侧表达式值为
false,
则表达式结果一定是
false,
无需计算右侧表达式
.
对于
||,
如果
左侧表达式值为
true,
则表达式结果一定是
true,
无需计算右侧表达式
.
&
和
|
如果表达式结果为
boolean
时
,
也表示逻辑运算
.
但与
&& ||
相比
,
它们不支持短路求值。
public class Test {
public static void main(String[] args) {
System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); //程序抛出异常
}
}
五. 位运算符
Java
中数据存储的最小单位是字节,而数据操作的最小单位是比特位
.
字节是最小的存储单位,每个字节是由
8
个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个
:
& | ~ ^ ,除
~
是一元运算符外,其余都是二元运算符。
位操作表示
按二进制位运算
.
计算机中都是使用二进制来表示数据的
(01
构成的序列
),
按位运算就是在按照二进制位的每一位依次进行计算。
1.
按位与
&
:
如果两个二进制位都是
1,
则结果为
1,
否则结果为
0。
2.
按位或
|:
如果两个二进制位都是
0,
则结果为
0,
否则结果为
1。
(注意点:
当
&
和
|
的操作数为整数
(int, short, long, byte)
的时候
,
表示按位运算
,
当操作数为
boolean
的时候
,
表示逻辑运算。)
3.
按位取反
~:
如果该位为
0
则转为
1,
如果该位为
1
则转为
0 。
4.
按位异或
^:
如果两个数字的二进制位相同
,
则结果为
0,
相异则结果为1。
(注意点:
如果两个数相同,则异或的结果为
0)
六. 移位运算(了解)
移位运算符有三个
:
<< >> >>>
,都是二元运算符,且都是按照二进制比特位来运算的。
1.
左移
<<
:
最左侧位不要了
,
最右侧补
0
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数
2.
右移
>>
:
最右侧位不要了
,
最左侧补符号位
(
正数补
0,
负数补
1)
3.
无符号右移
>>>:
最右侧位不要了
,
最左侧补
0。
注意:没有无符号左移!!
左移补右边的二进制位,右移补左边的二进制位。符号位只可能在左边。只有补左边的二进制位时,才会考虑有符号数(高位补符号位)还是无符号数(直接补 0),所以只有右移考虑有无符号。
1.
左移
1
位
,
相当于原数字
* 2.
左移
N
位
,
相当于原数字
* 2
的
N
次方
.
2.
右移
1
位
,
相当于原数字
/ 2.
右移
N
位
,
相当于原数字
/ 2
的
N
次方
.
3.
由于计算机计算移位效率高于计算乘除
,
当某个代码正好乘除
2
的
N
次方的时候可以用移位运算代替
.
4.
移动负数位或者移位位数过大都没有意义
.
七. 条件运算符
条件运算符只有一个
:
表达式
1 ?
表达式
2 :
表达式
3
当
表达式
1
的值为
true
时
,
整个表达式的值为
表达式
2
的值
;
当
表达式
1
的值为
false
时
,
整个表达式的值为
表达式
3
的值
.
也是
Java
中唯一的一个
三目运算符
,
是条件判断语句的简化写法
.
注意点:表达式不能单独存在,产生的结果必须要被使用。
public class Test {
public static void main(String[] args) {
int a=1;
int b=2;
a>b?a:b;//报错
}
}
八. 运算符的优先级
运算符之间是有
优先级
的
.
具体的规则我们
不必记忆
.
在可能存在歧义的代码中加上括号即可。
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c);//10
}
}
例如这题,>>的优先级低。我们先算前面的,(b-a)=10,a+10=20。前面提过,>>1,向右移动1位,除以2的一次方,结果为10。