java基础——运算符和运算符的优先级

计算机,顾名思义,就是计算的机器,所以在编程中,也要进行大量的计算(运算),运算的符号简称为运算符。由于计算机可以进行各种运算,所以提供了很多的运算符号,这些运算符号一部分是现实里经常使用的,也有不少是计算机中新增的。学习运算符,首先要掌握每种运算的运算规则,然后在适当的时候使用对应的运算符。这需要对于运算符最够的熟悉,并具备一定的计算机基础知识。运算符的种类很多,为了方便学习,以下按照类别来进行介绍。
算术运算符
算术运算符,也称数学运算符,是指进行算术运算的符号,语法中对应的符号、功能以及说明参看下表。
图片
说明:
在算术运算符中,+、-、*和/的运算规则和数学基本相同,在四则运算中,乘除优先于加减,计算时按照从左向右的顺序计算,不同的地方在于:
①程序中乘号不能省略,在数学上可以写y = 2x,但是程序中必须写成y=2 *x。
②运算结果的类型和参与运算的类型中最高的类型一致,例如整数加整数还是整数。影响最大的是除法,整数除整数结果还是整数,例如10/3 的结果是3,而不是3.333。
接着来说说取余运算符,%的功能是取两个数字相除的余数,例如10%3 表示计算10 除以3 的余数,则结果应该是1。取余运算在编程中的用途也比较大,比较常见的用途有:控制规则变化,控制随机数字的区间等。
算术运算符基本使用的示例代码如下:
图片
在算术运算符部分,需要特别注意的一个语法现象是“晋升”。晋升指低于int 的3 种数字类型(byte、short 和char)进行算术运算后,结果会自动提升成int 类型。示例代码如下:
图片
在程序中使用算术运算符实现程序中的数学运算,在运算时也可以加入小括号,和数学一样,在程序中也是先计算小括号内部的,然后再计算小括号外部的内容,示例代码如下:
图片
另外一个需要注意的就是,变量在计算时必须被赋值,否则直接报语
法错误,例如:
图片
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
比较运算符
比较运算符实现数据之间大小或相等的比较。比较运算符运算的结果是一个boolean 类型的值,如果比较结果成立则为true,否则为false。Java 语言中比较运算符的表示和功能见下表
图片
说明:
比较运算符的运算规则和现实中的规则一样。需要注意的问题主要有以下几个:
① boolean 类型只能比较相等和不相等,不能比较大小。
② >=的意思是大于或等于,两者成立一个即可,所以5>=5 成立。
③ 在数学上表示的区间[1,10),也就是数字大于等于1 同时小于10,在程序中不能写成如下格式:1<=n<10,这种书写在语法上是错误的,如果需要表达这种区间,则参看4.3 逻辑运算符实现部分。
④ 判断相等的符号是两个等号,而不是一个等号,这个需要特别小心。
比较运算使用的示例代码如下:
图片
在实际代码中,数值、变量以及运算结果都可以直接参与比较,只是程序中为了增强可读性,有些时候需要将比较分开进行书写。比较运算符是程序设计中实现数据比较的基础,也是很多逻辑实现的基础,在程序逻辑中,经常通过比较一定的条件,来判断后续的程序该如何执行。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
逻辑运算符
逻辑运算符是指进行逻辑运算的符号。逻辑运算主要包括与(and)、或(or)和非(not)三种,在程序中主要用来连接多个条件,从而形成更加复杂的条件。逻辑运算符的运算结果是boolean 类型。参与逻辑运算的数据也必须是boolean 类型。
关于逻辑运算符的种类和说明参看下表:
图片 
逻辑运算符使用示例代码: 
图片 
在实际程序中,可以根据逻辑的需要使用对应的逻辑运算符号。实际使用示例:
① 表示变量n 是否属于[0,10)区间
int n = 4;
boolean b = (n >=0) && (n < 10);
对于变量n 来说,只要n 同时满足大于等于零,且小于10,则位于[0,10)区间,由于程序中无法书写0<=n<10 这样的条件,则必须通过逻辑运算符进行连接。
② 表示变量n 不属于[0,10)区间
一种写法是:
int n = 4;
boolean b = !((n >= 0) && (n < 10));
这里,对于属于该区间的条件取反,则可以获得不属于该区间的条件。
另一种写法是:
int n = 4;
boolean b = (n < 0) || (n >= 10);
这里做了一个简单的变通,如果变量n 不属于该区间,则在数学上只需要满足n小于0 或者n 大于等于10 的任何一个条件即可,这样的或者关系在程序中实现时使用逻辑或实现。在程序设计中,根据逻辑需要,使用对应的逻辑运算符,可以实现相对比较复杂的组合条件,从而实现对应程序的功能。最后说一下&&和&的区别,其实在进行逻辑与运算时,既可以使用&&也可以使用&,在功能上本身没有区别。两者区别的位置在,对于&来说,如果左侧条件为false,也会计算右侧条件的值,而对于&&来说,如果左侧的条件为false,则不计算右侧的条件,这种现象被称作短路现象。 
示例代码:
图片 
则对于第二行代码来说,两个条件都将被计算,而对于第三行代码来说,因为n >= 0 这个条件不成立,则n < 10 根本不会被执行。当然,两者得到的最终结果是一样的。 
对于现在的代码来说,区别不大,但是如果后续的条件是一个方法(方法的概念后续将介绍到),则将影响程序逻辑。验证&和&&功能的示例代码如下: 
图片
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
赋值运算符
赋值运算符是指为变量或常量指定数值的符号。最基本的赋值运算符是“=”。由于Java 语言是强类型的语言,所以赋值时要求类型必须匹配,如果类型不匹配时需要能自动转换为对应的类型,否则将报语法错误。示例代码:
图片
需要强调的是,只能为变量和常量赋值,不能为运算式赋值,例如:
图片
常量只能赋值一次,否则也将出现语法错误,例如:
图片
在基本的赋值运算符基础上,可以组合算术运算符,以及后续将学习的位运算符,从而组成复合赋值运算符。赋值运算符和算术运算符组成的复合赋值运算符如下表所示:
图片
实际使用示例:
     int n = 2;
     n += 3;
说明:计算以前n 的值是2,也就是把n + 3 的值,也就是5 再赋值
给n,经过运算以后n 的值为5,因为该代码只执行一次,所以不会导致循环。
依次类推,其它的复合赋值运算符也是这样:
图片
注意:复合赋值运算不会改变结果的类型,所以在有些时候运算在逻辑上会出现错误,但是符合计算中数值的表述。例如:
byte b = 127;
b += 1;
System.out.println(b);
根据前面的介绍,byte 类型的取值区间是-128~127,由于复合赋值运算符不改变结果的类型,则导致结果是-128,而不是128。原因如下:
① byte 类型值127 的机器数是01111111,0 表示正数,后续的数值表示127。
② 该数值加1 后,得到的数值是10000000,二进制加法。
③而10000000 在byte 类型中恰好是-128 的机器数表示形式其它类型的符合运算符也可能存在类似的情况,使用时需要注意。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
位运算符
Java 语言中的位运算符主要有4 种:&(位与)、|(位或)、^(异或)和~(按位取反),下面依次介绍运算规则和使用示例。
&   ------(AND)
运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位都为1,则运算结果为1,否则为0。
适用场合:屏蔽数字中某一位或某些位。因为任何数和0 与都是0。
示例代码:
图片
计算过程:
4   的二进制形式为       0000 0000 0000 0000 0000 0000 0000 0100
10 的二进制形式为       0000 0000 0000 0000 0000 0000 0000 1010
按照计算规则,结果为    0000 0000 0000 0000 0000 0000 0000 0000
这个数字转换为十进制就是数字0
|   ------(OR)
运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位有一个为1 则为1,否则为0。
适用场合:将数字中某一位或某些位修改成1。因为1 和任何数或都是1。
示例代码:
图片
计算过程:
4 的二进制形式为          0000 0000 0000 0000 0000 0000 0000 0100
10 的二进制形式为        1111 1111 1111 1111 1111 1111 1111 0110
按照计算规则,结果为     1111 1111 1111 1111 1111 1111 1111 0110
这个二进制数转换为十进制就是数字-10。
^   -----(XOR)
运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位相同为零,不相同为1。
适用场合:判断数字对应的位是否相同。
示例代码:
 图片
计算过程:
4 的二进制形式为           0000 0000 0000 0000 0000 0000 0000 0100
10 的二进制形式为         0000 0000 0000 0000 0000 0000 0000 1010
按照计算规则,结果为      0000 0000 0000 0000 0000 0000 0000 1110
这个数字转换为十进制就是数字14 
~   -----(NOT) 
运算规则:只操作一个数字,将该数字中为1 的位变成0,为0 的位变成1。
适用场合:反转数字的内容
示例代码: 
图片
计算过程:
4 的二进制形式为           0000 0000 0000 0000 0000 0000 0000 0100
按照计算规则,结果为      1111 1111 1111 1111 1111 1111 1111 1011
这个数字转换为十进制就是数字-5。 
说明:
其实位运算和实际的应该实现保持一致,也就是提供的电路级运算符号,每种运算符都有对应的电路实现。实际使用简单示例:
① 把任意数字转换为正数,假设n 是一个任意的整数,则把n 转换为正数的代码为:
int m = n & 0x7fffffff;
② 判断任意数字倒数第三位的值是否为1,假设n 是一个任意的整数,则判断的代码为:
int m = n & 0x4;
boolean b = (m != 0);
③ 将任意数字倒数第四位置为1,假设n 是一个任意的整数,则代码为:
int m = n | 0x8; 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
移位运算符
移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。在移位运算时,byte、short 和char 类型移位后的结果会变成int 类型,对于byte、short、char 和int 进行移位时,规定实际移动的次数是移动次数和32 的余数,也就是移位33 次和移位1 次得到的结果相同。移动long 型的数值时,规定实际移动的次数是移动次数和64 的余数,也就是移动66 次和移动2 次得到的结果相同。
三种移位运算符的移动规则和使用如下所示:
  <<
运算规则:
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
图片
计算过程:
首先把3 转换为二进制数字0000-0000 0000-0000 0000-0000 0000-0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2 位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000-0000 0000-0000 0000-0000 0000-1100,则转换为十进制是12。
数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2 的1 次方,左移n 位就相当于乘以2 的n 次方。
  >>
运算规则:
按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
图片
计算过程:
11 的二进制形式为:0000-0000 0000-0000 0000-0000 0000-1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000-0000 0000-0000 0000-0000 0000-0010。转换为十进制是3。
数学意义:
右移一位相当于除2,右移n 位相当于除以2 的n 次方。
  >>>
运算规则:
按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。其他结构和>>相似。 
总结
二进制运算符,包括位运算符和移位运算符,使程序员可以在二进制基础上操作数字,可以更有效的进行运算,并且可以以二进制的形式存储和转换数据,是实现网络协议解析以及加密等算法的基础。但是,在实际使用中,为了使代码可读性强,还是大量使用一般的算
术运算符来进行数字运算。 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
其它运算符
对于无法归类,或者单独占一类的运算符,将在下面进行介绍。
  ++、--
这两个运算符是程序中的递增和递减运算符。其意义参照以下示例代码:
图片
n++的意义就是对原来变量n 的值加1 以后再赋值给自身,因为原来变量n 的值是0,加1 以后则变成1。同理,递减运算符的意义也是这样,示例代码:
图片
m--的意义就是对原来变量m 的值减1 以后再赋值给自身,则m 的值变成-1。需要注意的是++和—只能操作变量,而不能操作其他的内容,以下使用都是错误的:
图片
在实际书写时,++和—既可以写在变量的前面,也可以写在变量的后面,例如:
图片
同理,--也可以这样,那么这些在实际使用中有什么区别呢?其实对于变量的值来说,没有区别,也就是++无论写后面还是写前面,变量的值肯定增加1,--无论写在后面还是前面,变量的值都减1。其最大的区别在于整个式子的值,如n
++,规则如下:
①  ++或—写在变量前面,则该式子的值等于变量变化以前的值。
②  ++或—写在变量后面,则该式子的值等于变量变化以后的值。
示例代码如下:
图片
同理,--也是这样。
下面是一个稍微综合点的示例:
图片
说明:
注释部分为对应行代码运行以后,a 和b 的值。在程序开发中,可以使用该区别简化代码的书写,但是不推荐这样做,因为这样将增加阅读代码的难度。
   +、-
前面介绍过加减运算符,其实+、-还有另外一个意义,也就是代表正负,通常情况下正号可以省略,而负号可以和数值、变量以及运算式进行结合,示例代码如下:
图片
  ?   :
这个运算符称为条件运算符,其作用是根据判断的结果获得对应的值,语法格式
如下:
条件式? 值1 : 值2
语法要求条件式部分必须是boolean 类型,可以是boolean 值,也可以是boolean变量,或者是关系运算符或逻辑运算符形成的式子,值1 和值2 必须能够转换成相同的类型。
功能说明:如果条件式的结果是true,则整个式子的值取值1 的值,否则取值2的值。
示例代码如下: 
图片
   () 
括号,也是运算符的一种,作用是可以让括号内部的计算首先进行,这个和数学上一致,只是程序代码中可以使用这个组合任意的合法运算式。示例代码为:
int a = 1 + 2 * 3;
int a = (1 + 2) * 3; //和以上代码的运行结果不一致
其实每个运算符都有自己的优先级,使用括号可以提升对应式子的优先级。关于运算符优先级的概念,后续将进行介绍。 
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
运算符的优先级
在实际的开发中,可能在一个运算符中出现多个运算符,那么计算时,
就按照优先级级别的高低进行计算,级别高的运算符先运算,级别低的运算符后
计算,具体运算符的优先级见下表:
图片 
说明:
①  该表中优先级按照从高到低的顺序书写,也就是优先级为1 的优先级最高,优先级14 的优先级最低。
②  结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3+-4,则意义为3 加-4,符号首先和运算符右侧的内容结合。
③  instanceof 作用是判断对象是否为某个类或接口类型,后续有详细介绍。
④  注意区分正负号和加减号,以及按位与和逻辑与的区别其实在实际的开发中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代,示例代码:
图片
这样书写代码,更方便编写代码,也便于代码的阅读和维护。 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值