一、基本概念
运算符:表示运算符的符号,又称操作符
操作数:运算或者操作的对象
表达式:常量、变量、或者能够计算出结果的一串常量、变量和运算符的组合。例如123、x、x+123,三者属于表达式
二、优先级和结合性
提及运算符,除了运算符本身的功能外(例如、+表示加法),最重要的应该是优先级和结合性了 ,因为它们决定了表达式中运算符进行运算时的先后顺序。如下表所示,列举了java中优先级从高到低的运算符
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () [] . | 左 |
2 | ! ~ +正号 - 负号 ++ – | 右 |
3 | * / % | 左 |
4 | + 加 - 减 | 左 |
5 | << >> >>> | 左 |
6 | < <= > >= instanceof | 左 |
7 | == != | 左 |
8 | & | 左 |
9 | ^ | 左 |
10 | | | 左 |
11 | && | 左 |
12 | || | 左 |
13 | ?: | 右 |
14 | = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= | 右 |
1 在表达式中优先级高的运算符先进行运算。
例如,算术运算中先计算乘除,后计算加减
2 运算符优先级相同时,依据结合性判断运算顺序。(详细内容参考【c语言的左结合性与右结合性】)
例如,加减运算为左结合性,应从左到右依次执行运算符,表达式1+2-3,即先算+后算-;
赋值运算符(=)为右结合性,应该从右到左依次执行运算符
int a,b=1,c=2
a=b=c
应该先执行b=c,后执行a=b,最终结果a=2,b=2;
假设赋值运算符为左结合性,那么应该先执行a=b,后执行b=c,最终结果a=1,b=2;
3 括号可以改变运算符的优先级。当需要使用结合性判断运算符运算顺序或者由于不同语言优先级规则有些许不同,为了消除对优先级规则的依赖时,应该使用括号。
三 运算符分类
1 参与运算的操作数个数
单目运算符:! ~ +正号 - 负号 ++ –
三目运算符:? :
双目运算符:+ - * / 等等
2 运算符的功能
功能 | 运算符 |
---|---|
算术运算符 | + 、-、 * 、/ 、% |
关系/比较运算符 | < 、<=、 > 、>= 、== 、!= 、instanceof |
逻辑运算符 | &&、 | | 、!、&、| ^ |
位运算符 | ~、|、^、& |
移位运算符 | << 、>> 、 >>> |
赋值运算符 | =、+= -= *= /= %= &= |= ^= ~= <<= >>= >>>= |
3 具体用法
首先,需要简要说明数据类型的概念。(基本)数据类型包括两部分:数据集合(即值域)和定义在数据上的操作结合。以int类型为例,取值范围为[-231,+231-1],操作集合{+、-、*、/、%、…}。运算符和操作数是密不可分的,介绍时不免会有所涉及
(1)算法运算符
算术运算符: + 、-、 * 、/ 、%
在java中,实现了算术运算符的基本数据类型有:整型(byte、short、int、long)、浮点型(float、double)、字符型(char)。 char很少用于算术运算,但是其值是Unicode的码点,范围[0,65535],也是数值类型,所以可以进行算术运算。唯一不能算术运算的是布尔型(boolean),其实现的是逻辑运算符。
同样是除法/,其实现的细节并不一样。对应整型之间的除法,会”截取“结果都整数部分,”丢弃“结果都小数部分。例如5 / 3的值是1。而浮点型5.0/3.0的值是1.66666666666667。除法(其他算术运算符也不例外)像实例方法一样,是被重载过的。
未完待续。。。