运算符是一些特定的符号,允许对常量、变量及式子施加某种操作。
运算符相当于自然语言中的动词,那些被操作的常量,变量及式子被称为操作数,不同的运算符对参与运算的操作数和类型可能也有不同的要求。
此外,与数学上一样,java中的运算符也具有优先级。若多个运算符出现在同一式子中,则优先级高的先运算,对于优先级相同的运算符,则视运算符的结合性。
优先级 | 运算符 |
---|---|
1 | ()(显式先运算,方法调用) [] . ::(方法引用) |
2 | ! + - ~ ++ – ()(强制转换) |
3 | * / % |
4 | + - |
5 | << >> >>> |
6 | < <= > >= instanceof |
7 | == != |
8 | & |
9 | ^ |
10 | I |
11 | && |
12 | II |
13 | ?: |
14 | = += -= *= /= %= &= ^= I= <<= >>= >>>= |
说明:
- 优先级从高到低排列——优先级数字越小,优先级越高。
- 优先级为2的运算符是一元的——只对一个常量,变量或式子进行运算,优先级为13的运算符是java中唯一的三元运算符,其余都是二元运算符。
- 结合性是指多个具有相同优先级的运算符出现在同一个式子中时,运算所采取的方向,大部分运算符的结合性都是从左向右。较为典型的从右向左的运算符是负号,如式子:“3±4” 等价于“3+(-4)”
赋值运算符
赋值运算符是使用频率最高的运算符之一,其功能是将某个常量,变量或式子的值赋给某个变量。赋值运算符具体包含两种:简单赋值运算符和复合赋值运算符。
- 简单赋值运算符
简单赋值运算符是指 “=”,它将 “=” 右边的常量,变量或式子的值赋给左边的变量。
说明:
- “=” 的优先级是最低的,它总是被最后运算。
- “=” 左边只能是变量,右边通常是常量或变量,也可以是其它任何式子。
- “=” 运算符与数学上的 “=” 不同,后者除了 “=” 的左右均可以是任何式子之外,还有强调“左右相等” 之意,而前者无此含义。
- “=” 右边的值类型与左边变量的类型可以不一致,若右边类型较左边类型小,则系统自动将右边小类型转为左边大类型,反之则视为语法错误。
- 复合赋值
复合运算符具体包含12个,复合赋值运算符是12个运算符分别与 “=” 运算符的组合——在完成某种运算的同时进行赋值运算,如式子a+=2 等价于 a=a+2。
算术运算符
算术运算符用以完成数学上的加减乘除运算,具体包括7个:+、-、*、/、%、++和–,其中前5个统称为四则运算符,后2个分别称为自增和自减运算符。
- 四则运算
四则运算法与数学上对应的符号基本一致,它们都是二元运算符,即要求2个操作数参与运算。比较特殊的是其中的“%”+模除运算符,其计算某个整数对另一个整数的余数,因此也称为取余运算符。此外,“+”和“-” 还可以作为一元运算符,以表示某个数的正负。
int a =5,b =-2;
long c =20,d = 10, m;
float f1=3.2f,f2=-2f,f3;
m = a + b;
m =-c+-b;
m =+b-d-a;
m = b-2a; // 非法,乘号不能省略
m = a /(b-a)*d;
m = a%b;
m =a % f1; //非法, float型不能赋给long型
m =(long)a+f1; //非法,同上(+优先级比强制转换低)
m =(long)(a+f1);
f3 =-a/b*1.0f;
f3 =1.0f*a/b;
f3 =a%f1;
f3 =f1/f2;
f3 =(f1-0.1f)/f2;
f3 =f1%f2;
说明:
- 与数学上一样,乘除优先级高于加减并具有左结合性,但“+”“-”分别用作取正,取负时的优先级高于乘除,并具有右结合性。
- 对负数取正无效
- 乘号不能省略,否则视为语法错误
- 对于 “/”若参与运算的均为整数则做整除,否则做精确除。
- 若整除是2个数的符号相反,则余数符号与除数相同,并向零靠近。
- 对于“%” ,若参与运算的2个数均为整数,则结果为整除所得的余数,否则结果为a-(b*q),其中q=(int)(a/b)
- 不同类型相遇时,小类型被自动提升为大类型,运算结果为大类型
- 作为二元运算符,“+”还具有拼接字符串的功能。
- 当“+” 两侧都是数值时,完成的是相加而非拼接。
- 当“+” 两侧都是字符串时,直接拼接,若仅有某一侧是字符串,系统会自动将另一侧的值转换为对应的字符串形式,并拼接二者。
- 以“+” 拼接字符串的方式存在一定的性能损失,不要过多使用。
- 自增与自减
“++” 和 “–” 均是一元运算符,分别称为自增和自减运算符,它们的作用是将某个变量的值加1或减1后存回该变量。根据出现的位置不同,自增和自减运算符各自都有两种形式——前置形式和后置形式。
- 前置自增
若 “++”位于变量之前,如式子 “++i”,此时称为前置自增运算符——将i自增1,然后用增1后的值参与式子的运算。 - 后置自增
若 “++”位于变量之后,如式子 “i++”,此时称为后置自增运算符——用i的原值参与式子的运算,然后将i自增1。
关系运算符
关系运算符用于比较两个操作数的大小关系,具体包括6个:==、!=、>,>=,<,<=,分别用以判断两个操作数的值是否相等,不相等,大于,大于等于,小于,小于等于的关系。
- 关系运算符的优先级低于算术运算符,前者内部,==和!=的优先级低于其它4个。
- 因boolean型不能被转换为整数值,故其不能与其它基本类型进行关系运算,2个boolean型数据间只能进行相等或不相等的比较。
- 不能用数学上a<b<c的形式俩连续比较数值型,因为a<b的值是boolean型,不能与数值型c比较,此时应当用逻辑运算符来连接。
- 注意“==”与“=” 运算符的区别
- 由于精度限制,尽量不要使用关系运算符在整型与浮点型,之间做直接的大小比较,否则可能得到非预期的结果。
- 尽量不要用“==” 运算符判断两个字符串是否相等,而应使用String 类的equals方法。
条件运算符
条件运算符是指 “?:”,其使用“?”和“:”隔开3个式子,是java中唯一的三元运算符。条件运算符的使用格式为:
式子1 ?式子2 :式子3
条件运算符的逻辑是:若式子1成立,则取式子2的值作为整个式子的值,否则就取式子3的值,因整个式子的取值取决于式子1是否成立,故式子1也被称为条件,且值必须是boolean型。
逻辑运算符
逻辑运算符具体包括3个:!,&& ,||,它们均要求参与运算的式子的值为boolean型,并且整个式子的值也是boolean型。
运算符 | 使用格式 | 运算规则 |
---|---|---|
!(逻辑非) | !A | 若A为true,整个式子为false,否则为true |
&&(逻辑与) | A&&B | 只有当A,B同时为true时,整个式子才为true,其它情况均为false |
II(逻辑或) | AIIB | 只有当A,B当中一个为true时,整个式子为true,其它情况均为false |
- "!"是一元运算符,其优先级高于四则运算法和关系运算符,且具有右结合性
- “&&” 的优先级高于“||”
位运算符
位运算符的操作对象是二进制位,并要求操作数必须是整数型,具体可分为两类——按位运算符和移位运算符。
- 按位运算符
按位运算符依次操作数的每一位进行运算,具体包括4个:~,&,|,^。
-
按位非:~
按位非是位运算符中唯一的一元运算符,其对操作数的每一个二进制位进行“非”运算——0变1,1变0。 -
按位与:&
按位与对2个操作数的每一对二进制位分别进行“与”运算——只有1和1相遇,结果才为1,其它情况均为0。按位与运算符可以实现对整数A的某些二进制位清0,其余位不变,为了达到这样的效果,需要选取合适的整数B——将B对应于A要清0的那些位设为0,其余位设为1,此时的整数B被称为掩码。 -
按位或:|
按位或对两个操作数的每一对二进制位分别进行“或”运算——只有0和0相遇,结果才是0,其它情况均为1,按位或运算符可以实现对整数A的某些二进制位置1,其余位不变,将掩码B对应于A要置1的那些位设为1,其余位设为0。 -
按位异或:^
按位异或对两个操作数的每一对二进制位分别进行“异或”运算——相异为真(1)即1和0或者0和1相遇,结果为1,其它情况均为0,按位异或运算符可以实现对整数A的某些二进制取反,其余位不变,将掩码B对应于A要取反的位设为1,其余位设为0。
- 移位运算符
移位运算符将操作数对应的二进制位向左或向右移动若干位,具体包括3个:<<,>>,>>>,它们均是二元运算符,运算符左侧是要移动的数,右侧是移动位数。
- 有符号数左移:<<
每移动1位,二进制数的最高位被舍弃,最低位补0,在没有产生溢出的前提下,每左移1位都相当于将左侧操作数乘以2,故左移n位相当于乘以2的n次方。 - 有符号数右移:>>
每移动1位,二进制数的最低位被舍弃,最高位补原来的最高位,以保持数的符号不变,每右移1位相当于将左侧操作数整除2,故右移n位相当于整除2的n次方。 - 无符号数右移:>>>
每移动1位,二进制数的最低位被舍弃,最高位补0,每右移1位都相当于将左侧操作数除以2,故右移n位相当于除以2的n次方。 - 移位操作并不改变被移动的操作数,除非将结果存回了
- 若对byte,short,char型数据移位,数据会自动转换成int型
- 移动位数n可以是任何整数,但实际取其低5位值,对int型移或低6位值。
表达式
表达式相当于自然语言中的短语,通常由常量,变量以及运算符组成。
表达式是有类型的,一般来说,一个表达式中最后被运算符的部分决定了整个表达式的类型。
表达式 | 示例 | 相关变量值 | 表达式值 |
---|---|---|---|
赋值表达式 | a=b=1+2 | b=3,a=3 | 3 |
a*=b+4 | a=21 | 21 | |
c=!(d=(1>2)) | d=false , c=true | true | |
算术表达式 | (i=4)*(- -i) | i=3 | 12 |
i- - | i=2 | 3 | |
i*3%4 | i=3 | 1 | |
关系表达式 | false==(1>=2?true:false) | - | true |
条件表达式 | false==1>2?true:false | - | true |
逻辑表达式 | true&&(i=6)>9 | i=6 | false |
++i%7==0II–i<5 | i=7 | ture | |
!(i%7==0)&&–i<5 | i=7 | false | |
!(i%7==0&&–i<5) | i=6 | true | |
按位表达式 | (a=2)&-1 | a=2 | 2 |
a^a | a=2 | 0 | |
移位表达式 | (a=3)<<a | a=3 | 24 |