Java学习笔记——Java中的运算符

一、Java运算符概览

1.1 Java运算符的分类

运算符可以理解为操作符,运算符根据操作数的不同,可以分为:

  • 单目运算符
  • 双目运算符
  • 三目运算符

根据运算符的功能,可以分为:

运算符类型包含的运算符
算术运算符+、-、*、/、%、++、--
关系运算符>、<、>=、<=、==、!=
逻辑运算符&(逻辑与)、|(逻辑或)、!(逻辑非)、&&(短路与)、||(短路或)
赋值运算符=、+=、-=、*=、/=、%=、^=、&=、|=、<<=、>>=、>>>=
位运算符&(按位与)、|(按位或)、^(按位异或、~(按位取反)、<<(左移)、>>(带符号右移)、>>>(无符号右移))
条件运算符布尔表达式?表达式A: 表达式B
字符串连接运算符+
其他运算符instanceof、new

1.2 Java运算符的优先级

在这里插入图片描述

二、算术运算符

2.1 算术运算符一览表

运算符含义
+求和
-求差
*求积
/求商
%求余数/取模
++自增
--自减

2.2 重点介绍 ++ 和 -- 运算符

++表示自加1,即在变量现在的值的基础上加上1,有两种形式,一种是“++”出现在变量的后面,一种是“++”出现在变量的前面。它们的区别是:
A、“++”出现在变量的后面表示先参与其他的运算,再将自身的值加1,举例说明:

int a = 100;
int b = a++; //先将a的值100赋给b,a再自加1变为101
System.out.println(a); //输出101
System.out.println(b); //输出100
//或者
int x = 20;
System.out.println(x++); //输出为20
System.out.println(x); //输出为21

B、“++”出现在变量前面表示先将变量本身的值自加1,再参与其他的运算,举例说明:

int a = 100;
int b = ++a; //a先自加1,再将其值赋给b
System.out.println(a); //输出为101
System.out.println(b); //输出为101
//或者
int x = 20;
System.out.println(++x); //输出为21
System.out.println(x); //输出为21

自减运算符“--”与自增遵循如上A、B相同的规则,在此不再赘述。
** 注意:自增运算符和自减运算符只能作用于变量,不能作用于字面量,例如,下面的赋值方法是不合法的:**

int x = 10++;
//或者
int y = --20

思考题:执行完下面的代码,m和n分别是多少呢?

int m = 1;
int n = (++m) + (m++) +(--m) - (m--);
System.out.println(n);
System.out.println(m);

答案:
n = 4,m = 1
解析:
在这里插入图片描述

三、关系运算符

3.1 关系运算符一览表

运算符含义
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

3.2 关于关系运算符的两点说明

(1)关系运算符的运算结果只能是布尔类型(boolean),要么为true,要么为false;
(2)判断字符串是否相等不能用“==”运算符,应该用字符串的equals()方法,例如:

String s1 = "Hello";
String s2 = "hello";
System.out.println(s1.equals(s2)); //输出为false

四、逻辑运算符

4.1 逻辑运算符一览表

运算符含义备注
&逻辑与(双目)全真为真,有假即假(仍然计算全部表达式)
|逻辑或(双目)全假为假,有真即真(仍然计算全部表达式)
!逻辑非(单目)假变为真,真变为假
&&短路与(双目)全真为真,遇假结束运算
||短路或(双目)全假为假,遇真结束运算

4.2 说明

(1)逻辑运算符除了逻辑非(取反)“~”为单目运算符之外,其余均为双目运算符,操作数是boolean类型的变量,操作结果也是boolean类型的,即要么为true,要么为fasle。

(2)注意逻辑与(逻辑或)和短路与(短路或)的区别
请看下面的代码:

//使用逻辑与(&)
int a = 20;
int b = 30;
System.out.println((a > b) & (a > b++)); //很明显输出为false
System.out.println(b); //b是多少呢?b变为了31,因为上面的b++被执行了

//使用短路与(&&)
int x = 20;
int y = 30;
System.out.println((x > y) && (x > y++)); //也是false
System.out.println(y); //这里,y仍为30,即上面的y++未被执行

可以看出,使用逻辑与(&)进行条件判断的时候,即使某个表达式已经为“假”了,但是后面的表达式仍然会被计算;而使用短路与(&&)的时候,如果遇到某个表达式的值为“假”,那么就不再计算后面的表达式。

五、赋值运算符

5.1 赋值运算符一览表

赋值运算符分为基本赋值运算符和扩展赋值运算符,如下表所示

类型运算符
基本赋值运算符=
扩展赋值运算符+=、-=、*=、/=、%=、^=、&=、|=、<<=、>>=

5.2 关于赋值运算符的几点说明

(1)要注意 x += 1 和 x = x + 1的区别
请看下面的代码

byte x = 10;
x = x + 1; //报错【错误: 不兼容的类型: 从int转换到byte可能会有损失】

上面的代码有错误是因为在计算 x = x + 1的时候,1 被视为int类型的,将其赋给 byte类型的x,所以会错误。
而下面的代码:

byte x = 10;
x += 1; //这样写没毛病Old iron

这样写是没问题的,因为在这里 x += 1 其实相当于 x = (byte)(x + 1),即使运算的结果超出 byte 的范围也不会报错,而是会发生溢出。
(2)使用扩展赋值运算符(+=、-=、*=、/=等等)不会改变变量的类型,但可能会造成精度的损失。

六、位运算符

6.1 位运算符一览表

运算符含义备注
&按位与
|按位或
^按位异或
~按位取反
<<左移低位填充0
>>带符号右移高位填充符号位
>>>无符号右移高位填充0

6.2 位运算符详解

以下面的代码为例进行详解

public class BitOperationTest{
	public static void main(String[] args){
		int a = 125;   //0b 0000_0000_0111_1101(补码=原码)
		int b = 365;   //0b 0000_0001_0110_1101(补码=原码)
		int c = -1283; //0b 1111_1010_1111_1101(补码)
		
		//                               十进制↓          补码↓
		System.out.println(a & b);    //输出109,  0b 0110_1101
		System.out.println(a & c);    //输出125,  0b 0111_1101
		System.out.println(a | b);    //输出381,  0b 0000_0001_0111_1101
		System.out.println(a | c);    //输出-1283,0b 1111_1010_1111_1101
		System.out.println(a ^ b);    //输出272,  0b 0000_0001_0001_0000
		System.out.println(a ^ c);    //输出-1408,0b 1111_1010_1000_0000
		System.out.println(~a);       //输出-126, 0b 1111_1111_1000_0010
		System.out.println(~c);       //输出1282, 0b 0000_0101_0000_0010
		System.out.println(a << 3) ;  //输出1000, 0b 0000_0011_1110_1000
		System.out.println(a >> 3);   //输出15,   0b 0000_0011_1110_1000
		System.out.println(c >> 3);   //输出-161,  0b 1111_1111_0101_1111
		System.out.println(a >>> 3);  //输出15,    0b 0000_0000_0000_1111
	}
}

七、条件运算符

条件表达式的格式为:

布尔表达式? 表达式1 : 表达式2

当布尔表达式的值为 true 时,整个表达式的值为表达式1的值,否则,整个表达式取表达式2的值。

八、字符串连接运算符

加号 “+” 除了作为加法运算的运算符之外,还可以作为字符串连接运算符。
当 “+” 两边均为数值类型时,作为加法运算符;
当 “+” 任意一边为字符串类型时,作为字符串连接运算符。

那如果既有数值型也有字符串呢?这时会遵循从左到右的顺序依次运算,除非加圆括号改变运算的优先顺序,例如下面的代码:

int a = 100;
int b = 200;
String s = "Hello";
System.out.println(a + b + s); //先计算 a+b=300,再计算 300+"Hello",结果为"300Hello"
System.out.println(a + (b + s)); //先计算 b + s,结果为"200Hello",再计算 a + "200Hello",结果为"100200Hello"
//输出“100 + 200 = 300”
System.out.println(a + "+" + b + "=" + (a + b)); //输出"100 + 200 = 300"
//去掉小括号呢?
System.out.println(a + "+" + b + "=" + a + b); //输出"200 + 100 = 200100"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值