运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。Java语言使用运算符将一个或者多个操作数连缀成可执行的语句。
JAVA语言当中的运算符可分为以下几种:算数运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、类型相关运算符。
1.算术运算符
Java支持所有的基本算术运算符用于执行基本的数学运算:加、减、乘、除和取模。
+:加法运算符,将两数据的值相加起来。此外,+ 还可以作为字符串的连接运算符。
注意:byte + byte 以及short + short这种低于4个字节的类型,会先发生整形自动提升(int型)再参与计算。如果要将计算的值分别赋值给 byte和short类型的数据就需要使用到强制类型转换。
- :减法运算符,将两数据的值相减。
- 除可以作为减法运算符之外,还能够作为求负的运算符,即求相反数。
* :乘法运算符,将两数据的值相乘。
\ :除法运算符,将两数据的值相除。
注意:
1. 如果除法运算符的两个操作数都是整数类型,则计算结果也为整数,即截断取整。
2. 如果两个操作数都是整数类型,则除数不可以是0,否则会发生算数异常。
3. 如果两个操作数至少有一个是浮点数,则计算结果也为浮点数。此时,允许除数为0或者0.0,得到的结果就是正无穷大或者负无穷大。
% :求余运算符,它的计算结果是使用第一个操作数除以第二个操作数,得到一个整数结果后剩下来的值就是余数。
注意:
1. 如果两个操作数都是整数类型,则求余运算的第二个操作数不可以是0,否则会发生算数异常。
2. 如果两个操作数至少有一个是浮点数,则计算结果也为浮点数。此时,允许除数为0或者0.0,得到的结果就是非数NaN。
3. 0或0.0对零以外的任何数求余都将得到0或0.0。
++ :自增运算符,自增是单目运算符,只能操作一个数。另外,自增运算符只能操作单个数值型(整型、浮点型)的变量,不能操作常量或表达式。自增分为前置++和后置++。看代码:
int a = 5 ;
int b = 0 ;
b = a++;
System.out.println("a ="+ a +" ,b =" + b);
a = 5;
b = 0;
b = ++a;
System.out.println("a ="+ a +" ,b =" + b);
-------------------------------------------
输出结果:
a = 6 ,b = 5
a = 6 ,b = 6
前置++ 先是将操作数自增1,然后将值赋值出去。
后置++ 先是将操作数的值赋值出去,之后操作数自增1。
- - :自减运算符,用法和上述的 自增运算符基本相似,仅为对操作数的值减1。
2.赋值运算符
赋值运算符用于为变量指定变量值,使用 = 作为赋值运算符。赋值运算符是从右向左执行计算的,程序先计算得到赋值运算符右边的值,然后再将该值赋给左边的变量,因此赋值运算符左边的只能是变量。另外,赋值运算符还可以与其他运算符结合,成为更加强大的赋值运算符。例如 += 、-= 、*= 、/=、%=、&=、|=、^=、<<=、>>=、>>>=,这些运算符不仅拥有更好的性能,还能保证程序更加的健壮。
3.位运算符
Java的位运算符有7种。
&:按位与;|:按位或 ;~:按位非 ;^:按位异或。
第一个操作数 | 第二个操作数 | 按位与 | 按位或 | 按位异或 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
按位非只需要一个操作数,这个位操作符在计算机底层的二进制码按位取反。
此位值 | 按位非 |
---|---|
0 | 1 |
1 | 0 |
例子:10010 | 01101 |
右移运算符 >> 和 >>> ,对于 >> 来说,将操作数的二进制码右移指定位数后,左边空出来的位以原来的符号位进行填充。对于 >>> 来说,它是一个无符号右移运算符,它将操作数的二进制码右移指定位数后,左边均使用0来填充。
左移运算符 <<,将操作数的二进制码整体向左移指定位数,左移之后空出来的位以0填充。
对于移位运算符有下列注意事项:
1. 对于低于int 类型(如byte、short和char)的操作数总是先自动类型转换为int 类型再进行移位。
2. 对于int类型的整数移位a>>b,当b>32时,系统会先用b 对32求余,得到真正的移位位数。例如 a>>33和a>>1的结果相同。
3. 对于long类型的整数移位 a>>b,当b>64时总是先对b 除以64求余得出真正的移位位数。
4.比较运算符
比较运算符用于判断两个变量或者两个常量的大小,比较运算的结果是一个布尔值 (true或者false)。
> :大于,仅支持左右操作数为数值类型,前者大于后者返回true,反之false。
>= :大于等于,仅支持左右操作数为数值类型,前者大于等于后者返回true,反之false。
< :小于,仅支持左右操作数为数值类型,前者小于后者返回true,反之false。
<= :大于等于,仅支持左右操作数为数值类型,前者小于等于后者返回true,反之false。
== :等于,如果进行比较的左右操作数为数值类型,即使他们的数据类型不相同,只要它们的值相等就会返回true,例如,97=='a’返回true ,5.0 == 5返回true ,true == false将会返回false。
!= :不等于,如果进行比较的左右操作数为数值类型,即使他们的数据类型不相同,只要它们的值相等就会返回true。
5.逻辑运算符
逻辑运算符有6种:&、&&、|、||、!、^。
下面用表格来表述逻辑运算符:
表达式1 | 表达式2 | && | || | ^ |
---|---|---|---|---|
false | false | false | false | false |
false | true | false | true | true |
true | false | false | true | true |
true | true | true | true | false |
&&:当表达式1为false时,则不执行表达式2;当表达式1位true时,执行表达式2,若为true则为true,反之为false。
&:无论表达式1为true或false都会去判断表达式2的真假。
|| :当表达式1为true时,则不执行表达式2;当表达式1为false时,执行表达式2,若为false则为false,反之为true。
| :无论表达式1为true或false都会判断表达式2的真假。
因此,&& 和 || 又被称为短路与 和短路或
6.三目运算符
三目运算符表达式为 表达式1 ? 表达式2 : 表达式3
规则如下:先对逻辑表达式1求值,如果逻辑表达式1返回true,则返回表达式2操作数的值。如果逻辑表达式1返回false,则返回表达式3操作数的值。三目运算符可以进行嵌套,嵌套后的三目运算符可以处理更多复杂的情况。
int a = 20;
int b = 30;
System.out.println(a > b ?
"a 大于 b" : (a < b ? "a 小于 b" : " a 等于 b"));
---------------------------
输出结果:
a 小于 b
7.运算符的结合性和优先级
Java语言中大部分运算符都是从左向右结合的,但只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的。
例如:
System.out.println(10 < 20 && 20 <30);
此时就会很明显先计算10<20和20<30,在计算&,否则20&20这样的操作会发生语法错误。
int a = 10;
System.out.println(5 < a < 20);
此例将无法通过编译,因为表达式先会执行 5 < a ,返回true。之后判断true<20,此时数据类型不相同,无法进行比较,编译就会不通过。
结论:运算符之间是有优先级的,具体虽不必强行记忆,但需要在拥有歧义的代码当中适当使用括号来区分优先级。