Java基础运算符与运算优先级

在Java语言中支持如下运算符:

算术运算符:

又分为二元运算符和一元运算符:

二元运算符 : +(加) -(减) *(乘) /(除) %(余,模运算)

一元运算符 : ++(自增) --(自减)

这里延伸一点,来看一段代码:

long a = 123123123123L;
float b = 3141;
double c = 3141592;
int d = 123;
short e = 10;
byte f = 8;
System.out.println(a+d+e+f);//Long类型
System.out.println(b+d+e+f);//Float类型
System.out.println(c+d+e+f);//Double类型
System.out.println(d+e+f);//Int类型
System.out.println(e+f);//Int类型

从上面我们得出的结论是:参与运算有一个Long,Double或Float类型时,结果也为Long,Double或Float类型,当没有Long,Double或Float参与运算时,所有结果都为Int类型.(这里可以参考基本数据类型的优先级,以int为界限,类型优先级大于Int的参与运算结果为最大优先级类型,反之,结果输出均为Int类型)

对一元运算符(++ --),我们会遇到一些常见的问题:

先来看一段代码:

int a = 3;

int b = a++; //执行完这行代码之后,先把a赋值给b,再自增
System.out.println(b);//3
System.out.println(a);//4

int c = ++a; //执行完这行代码之前,先自增,再把a赋值给c
System.out.println(a);//5
System.out.println(c);//5z

++和--这两个一元运算符在变量前和变量后是完全不同的,加在变量后,是先执行赋值操作,再自增;而加在变量前,是先自增,再执行赋值操作,所以输出的结果是不一样的.大家可以结合代码去理解.

在这里再给大家引入一个Math工具,学过数学的同学们应该都听过幂运算,但在Java语言里面怎么实现呢,这里就需要借助Math工具(包含数学里面一些复杂运算),这里的幂运算就需要使用到Math工具中的pow,具体格式是:数据类型 变量名 = Math.pow(底数,次幂).代码如下:

double pow = Math.pow(2,3);
System.out.println(pow); //2^3=8

赋值运算符(=):

需要注意是一个等于(=)号,==号才是判断是否相等,属于后面的关系运算符.

关系运算符:

>(大于) <(小于) >=(大于等于) <=(小于等于) ==(等于,是否相等) !=(不等于)

instanceof(左边是对象,右边是类,判断对象是否是右边类或子类所创建对象)

返回结果(布尔值):正确(true) / 错误(false)

逻辑运算符:

&&与(and) : 逻辑与运算:两个变量都为真,结果才为真,有一个变量为假,结果都为假

||或(or) : 逻辑或运算:两个变量有一个为真,结果为真,两个变量都为假,结果才为假

!非(取反) : 逻辑非运算:变量为假,结果为真,反之,变量为真,结果为

看一段代码:

boolean a = true;
boolean b = false;
System.out.println("a && b: "+(a && b));//false
System.out.println("a || b: "+(a || b));//true
System.out.println("!(a && b): "+!(a && b));//true
System.out.println("!(a || b): "+!(a || b));//false

注:在逻辑与运算中底层遵循短路运算规则,即如果判断出前面变量为假,则会跳过后面变量真假的判断:

int c = 5;
boolean d = (c>10)&&(c++>5);
System.out.println(d);//false
System.out.println(c);//5

int e = 5;
boolean f = (c>0)&&(c++>10);
System.out.println(d);//false
System.out.println(c);//6

通过上面的对比我们不难知道,当逻辑与运算前面的变量为假时,跳过后面运算,直接输出结果为false.这是我们要注意的.

位运算符(主要用来对操作数二进制的位进行运算):

&(或) : 二进制位的或运算,全是1则为1,有0则为0.

|(与) : 二进制位的与运算,有1则为1,全是0则为0.

^(异或) : 二进制位的异或运算,相同则为0,不相同则为1.

~(取反) : 二进制位的取反运算,0为1,1为0.

代码实现:

/*
A   = 0100 1011
B   = 0101 1010
----------------
A&B = 0100 1010 //全是1则为1,有0则为0.
A|B = 0101 1011 //有1则为1,全是0则为0.
A^B = 0001 0001 //相同则为0,不相同则为1.
~B  = 1010 0101 //0为1,1为0.
*/

这里问大家一个问题:如果最快计算出2乘8的结果?

2乘8可以表达乘(2*(2*2*2))正确答案是(2<<3)=16,这里的<<是我们下面要讲到的右移.

首先我们先来用二进制表示数字0到8:

0000 0000   0   0000 0001   1
0000 0010   2   0000 0011   3
0000 0100   4   0000 0101   5
0000 0110   6   0000 0111   7
0000 1000   8     .....
0001 0000   16

不难发现,数字2的二进制的1每往左移(<<)一位,他所表达的数大小就乘以2,那2乘以8,就是乘3个2,所以左移三位.同理,那每右移(>>)一位也就是除以2,那16除8最快的方法就是(16>>3)得到结果2.

注:上面的左移(<<)和右移(>>)都是"有符号的移动",而>>>()是无符号的右移,这里就不展开了.

条件(三元/目)运算符:

首先它的格式是 : x ? y : z        如果x为真,则结果为y;否则结果为z.

看一段代码:

int score = 80;
String type = score < 60 ? "不及格" : "及格";
System.out.println(type);//及格

这个是

扩展赋值运算符:

+=(加等) / -=(减等) : a+=b / a-=b        等价为        a=a+b / a=a-b

*=(乘等) / /=(除等) : a*=b / a/=b        等价为        a=a*b / a=a/b

这里引入一点 : +号在java程序中还可以作为字符串连接符

看一段代码:

int a = 10;
int b = 20;
a+=b; //a = a+b;
a-=b; //a = a-b;
System.out.println(a);
//字符串连接符(+)
System.out.println(""+a+b);//1020
System.out.println(a+b+"");//30

这里我们可以看到字符串的位置不同,输出的结果也不一样,这就引出了运算优先级的问题:

在java的运算中,大部分运算都是从左到右运算的,像赋值运算符,单目/三目运算符是特殊的从右到左运算的.

在java中也是有明确的运算优先级规定的,简单记忆就是:括号((),[],{}) -> 一元运算符 -> 二元运算符 -> 位移运算符 -> 关系运算符 -> 逻辑运算符 -> 三元/目运算符 -> 赋值运算符.这里我们只需要记住括号的优先级最大,逗号的优先级最小,再就是到一元二元就够用了,这最常用的记住就够了,他只是一个代码的桥梁.会随着你的代码功底提升而稳固.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值