Java教程07-运算符与表达式

阅读原文

运算符

运算符是用来表示运算的一种符号,Java中运算符分为五大类:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符。

算数运算符及表达式

算数表达式是由算数运算符和操作数构成,操作必须是数值类型,比如byte、short、int、double等,需要注意的是char类型也算是一种特殊的数据值类型,所以也可构成算数表达式中的操作数。当然也可以根据最少参与运算的操作数的个数,将算数运算符分为一元算数运算符和二元算数运算符。
一元算数运算符:+、-、++、–,一元算数运算符中+、-表示正负、++、–有两种使用方式,第一种++a,表示先将a加1之后再参与运算;第二种a++,表示将a先参与运算然后再加1。
栗子

//定义变量
int a = 1;
//表示负数,结果:-1
int b = -a;
//表示正数,结果:1
int c= +a;
//表示a先加1再参与运算,结果:2,a的值为2
int d = ++a;
//表示a先减1再参与运算,结果:1,a的值1
int e = --a;
//表示a先参与运算再加1,结果:1,a的值为2
int f = a++;
//表示a先参与运算再减1,结果:2,a的值为1
int h = a--;

二元算数运算符:+、-、*、\、%,二元元素运算符,每次参与运算有且只有两个操作数,分别置于运算符的两端。其中“%”表示取余,a%b,表示获取a和b相除的整数商。
栗子

//定义变量
int a = 1;
int b = 2;
//加法运算,结果:3
int c = a + b;
//减法运算,结果:1
int d = b - a;
//乘法运算,结果:2
int e = a * b;
//除法运算,结果:2
int f = b/a;
//取余运算,结果:0
int h = a/b;

关系运算符及表达式

Java中有六种关系运算符:>、>=、<、<=、==、!=,其中需要注意的是Java语言中的等于是由两个等于号构成,而且Java中的任意一种数据类型都可通过==或者!=进行比较。关系表达式由操作数与关系运算符构成,其表达式结果类型有且只有一种布尔型,当关系表达式成立时,其结果为true否则为false。
栗子

//定义变量
int a = 5;
int b =10;
int c = 5;
//关系运算符,大于,结果true
boolean d = b > a;
//关系运算符,大于等于,结果true
boolean e = c >= a;
//关系运算符,小于,结果true
boolean f = a < b;
//关系运算符,小于等于,结果true
boolean h = c <= b;
//关系运算符,等于,结果true
boolean i = c == a;
//关系运算符,不等于,结果true
boolean j = b != a;
//关系运算符,大于,结果false
boolean k = a > b;

逻辑运算符及表达式

Java中有六种逻辑运算符分别是:&(逻辑与)、&&(短路与) 、|(逻辑或)、||(短路或)、!(非,取反)、^(异或,运算符两端的关系表达式结果相同则异或表达式的结果为false否则为true)。逻辑表达式由逻辑运算符与关系表达式构成。
逻辑与与短路与、逻辑或与短路或之间的区别?

逻辑与表达式的运算,从左至右依次进行运算,无论关系表达式的结果是否为false,必须从左至右将整个表达式计算完毕才结束。

短路与表达式的运算,从左至右依次进行运算,只要有一组关系表达式的结果为false,将不在往后执行运算,该逻辑与表达式的结果就是false,所以称之为短路与运算,就好比是电路短路了,电流无法通过该线路一样。

那么对于逻辑或与短路或表达式也是一样的,对于逻辑或运算,从左至右依次进行运算,无论关系表达式的结果是否为true,必须从左至右将整个表达式计算完毕才结束;对于短路或运算,从左至右依次进行运算,只要有一组关系表达式的结果为true,将不在往后执行运算,该逻辑与表达式的结果就是true。
栗子

int a = 5;
int b = 10;
boolean c = false;
boolean d = true;
boolean e = b > a;
//逻辑与运算,结果:false
boolean h = (a > b) & c & d;
//逻辑或运算,结果:true
boolean i = (a > b) | c | d;
//短路与运算,结果:false
boolean j = (a > b) && c && d;
//短路或运算,结果:true
boolean k = (a > b) || c || d;
//非,结果:true
boolean l = !c;
//异或运算,结果:true
boolean m = c ^ d;

由运算结果可以看出,逻辑与、短路与以及逻辑或、短路或的表达式结果是相同的,只是短路运算的方式比逻辑运算的方式更为快捷。

位运算符及表达式

在Java中总共有四种逻辑位运算符和三种移位运算符,其中四种逻辑位运算符为:&、|、^、~,三种移位运算符为:<<、>>、>>>,这些运算符的操作都为整型数值,那么由位运算符及整型操作数构成的表达式就是位运算表达式。
在之前的文章中我们,也提到计算机是以补码的形式存储和运算数据的,那么在Java中位运算都是以补码的方式按位进行的。
栗子

/**
*定义整型变量*a的补码为:0000_0000_0000_0000_0000_0000_0000_1010
*b的补码为:1111_1111_1111_1111_1111_1111_1111_1110
*按位相与,a & b:     0000_0000_0000_0000_0000_0000_0000_1010(10)
*按位相或,a | b:     1000_0000_0000_0000_0000_0000_0000_0010(-2)
*按位异或(相同为0,不同为1),a ^ b:     1000_0000_0000_0000_0000_0000_0000_1100(-12)
*按位取反,~a         1000_0000_0000_0000_0000_0000_0000_1011(-11)
*左移:a << 2,0000_0000_0000_0000_0000_0000_0010_1000(40)
*右移:a >> 2,0000_0000_0000_0000_0000_0000_0000_0010 (2)
*右移:b >> 1, 1000_0000_0000_0000_0000_0000_0000_0001 (-1)
*无符号右移:b >>> 1,0111_1111_1111_1111_1111_1111_1111_1111(2147483647)
*/
int a = 10;
int b = -2;
int c = a & b;
int d = a & b;
int e = a ^ b;
int f = ~a;
int h = a << 2;
int i = a >> 2;
int j = b >> 1;
int k = b >>> 1;

以上栗子中给出的结果都是二进制原码,那么有人可能要问了,到底是怎样计算的呢?
第一步:先将需要参与运算的操作数转化为二进制原码
第二步:再将其原码分别转换为补码
第三步:将补码参与位运算得到位运算结果
第四步:判断该补码是表示正数还是负数,如果是正数,则补码就是原码,转换为十进制即可得出结果,如果是负数,则对补码再求一次补码得出结果的原码,再转为十进制即可得出结果。

对于移位的运算,由于每种类型的整型数据在计算机中所占的位数是有限的,比如int型,在内存中,只有32个位空间,其中一位表示符号位,剩余31位表示数值大小,那么在进行移位运算时,如果是左移,则高位移出部分被截断,低位不足部分补0即可;如果是右移,低位移出部分被截断,高位不足部分,如果符号位1则补1,为0则补0;如果是无符号右移,低位移出部分被截断,高位不足部分,补0即可;

赋值算符及表达式

Java中赋值运算符只有一个“=”,但是其扩展的赋值运算符有十一个,分别为:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>=。赋值表达式就是把右边的值或者表达式的计算结果赋值给左边的变量。对于扩展的赋值运算符,可以转换为更加易于理解赋值表达式,例如:a += b 等价于a = a + b,其他的扩展赋值运算符也是类似的原理。
栗子

//定义变量,使用赋值运算符= 
int a = 10; 
//扩展赋值运算符:+=,-=,*=,/=,%= 
int b = 1; 
b += 1;//等价于b = b + 1,结果:b的值为2; 
b -= 1;//等价于b = b - 1,结果:b的值为1; 
b *= 1;//等价于b = b * 1,结果:b的值为1;
b /= 1;//等价于b = b / 1,结果:b的值为1;
b %= 1;//等价于b = b % 1,结果:b的值为0;

表达式中类型的自动提升

当数值型基本数据类型参与算数表达式运算时,数据类型会发生自动提升,提升规则如下:
1、所有的byte、short、char类型均提升为int类型。
2、算数表达式中所有的数值型数据类型将自动提升至与表达式中数据类型最高的操作数同样的类型。

栗子

//定义变量
byte a = 1;
byte b = 2;
char h = 'a';
float f = 1f;
double d = 2.5;
long l = 1L;
//byte c = a + b; 错误,最终结果类型已经提升至int类型
//byte c = (byte)a + (byte) b; 错误,,最终结果类型已经提升至int类型
byte c=  (byte) (a + b);//将int类型强转至byte类型,有可能造成精度丢失
int j = a + b;//用相同类型接收
//int e = a + b + h + f + d + l; 错误,最终结果类型已经提升至double类型   
int k = (int) (a + b + h + f + d + l);//将double类型强转至int类型,造成精度丢失
double e = a + b + h + f + d + l;//用相同类型接收

Java中运算符的优先级

在进行复杂的混合运算时,比如有一个以上的运算符参与运算时,运算符根据优先级从上至下,同级运算符从左至右依次进行运算。
在这里插入图片描述
至此,对于Java的常规运算符已经讨论完了,当然还有一些其他的运算符,比如?:、new、instance of、.等等,我会在后续的文章中详细说明。

更多最新技术文章,请关注“冰点IT”公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值