Java 运算符
Java运算符,是一些特殊的符号,它们对一个或者多个操作数执行特定的运算,然后返回一个结果
我们可以将Java运算符分为以下几类
-
算术运算符
-
关系运算符
-
位运算符
-
逻辑运算符
-
赋值运算符
-
其他运算符
下面分别来讲解这几种运算符
1 算术运算符
算术运算符和数学中的运算符的作用是一样的,下面列出了所有的算术运算符
假如 a = 20 , b = 10
, 如下:
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 :相加运算符两侧的值 | a + b 等于 30 |
- | 减法 :左操作数减去右操作数 | a – b 等于 10 |
***** | 乘法 :相乘操作符两侧的值 | a * b等于 200 |
/ | 除法 :左操作数除以右操作数 | a / b 等于 2 |
% | 取余 :左操作数除以右操作数的余数 | a % b 等于 0 |
++ | 自增 :操作数的值增加1 | b++ 或 ++b 等于 11(区别详见下文) |
-- | 自减 : 操作数的值减少1 | b-- 或 --b 等于 9(区别详见下文) |
示例1:
public class HelloWorld { public static void main(String[] args){ int a = 6; int b = 2; int c = 5; System.out.println( a + b ); //输出 8 System.out.println( a - b ); //输出 4 System.out.println( a * b ); //输出 12 System.out.println( a / b ); //输出 3 System.out.println( a % b ); //输出 0 System.out.println( a % c ); //输出 1 } }
下面讲讲 a++
和 ++a
的区别
-
a++
变量名在前面,++
在后面:意思就是 先使用a
, 再对a
进行自增操作 -
++a
变量名在后面,++
在前面:意思就是 先对a
自增操作,再使用a
--
操作符和++
类似
举例说明:
示例2:
public class HelloWorld { public static void main(String[] args){ int a = 6; int b = 6; System.out.println( a++ ); // 输出 6 - 先使用 a ,也就是先打印 a 打印完 a 的值后,再对 a 进行自增 System.out.println( a ); // 输出 7 System.out.println( ++b ); // 输出 7 - 先对 b 自增,再打印,所以输出 7 System.out.println( b ); // 输出 7 } }
2 关系运算符
关系运算符也称为比较运算符,比如 大于
,小于
,等于
,不等于
....
比较的结果是一个布尔值(true
或者 false
)
下表列出了关系运算符 , 假如 a = 2, b = 3
运算符 | 描述 | 例子 (a = 2, b = 3) |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (a == b)为 false |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (a != b) 为 true |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (a > b)为 false |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (a < b)为 true |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (a >= b)为 false |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (a <= b)为 true |
示例:
public class HelloWorld { public static void main(String[] args) { int a = 2; int b = 3; System.out.println( a == b ); // 输出 false System.out.println( a != b ); // 输出 true System.out.println( a > b ); // 输出 false System.out.println( a < b ); // 输出 true System.out.println( a >= b ); // 输出 false System.out.println( a <= b ); // 输出 true } }
注意:比如两个值是否相等,是
==
,两个等号,不是一个等号,一个等号的=
是赋值运算符,后面会讲到
3 位运算符
Java语言提供了对整型类型的数值进行位操作
称作位运算符
位运算符在实际的编码中,运用的不是很多,但是在有些场合下使用的话,能提高代码的效率
假如 a = 75 , b = 24
, 对应的二进制如下
a = 75 <==> 0100 1011
b = 24 <==> 0001 1000
如下表
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1 ,则结果为1 ,否则为0
|
(a & b),得到12,即 0000 1000 |
| | 如果相对应位都是 0 ,则结果为 0 ,否则为 1
|
(a | b ) , 得到 91 , 即 0101 1011 |
^ | 如果相对应位值相同,则结果为0 ,否则为1
|
(a ^ b), 得到 83,即 0101 0011 |
〜 | 按位取反运算符翻转操作数的每一位,即0 变成1 ,1 变成0 。 |
(〜a), 得到 -76,即 -100 1100 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | a << 2 , 得到 300,即 1011 1011 1000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | a >> 2, 得到18, 即 0001 0010 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | a>>>2 , 得到 18, 即 0001 0010 |
4 逻辑运算符
Java的逻辑运算符包括 &&
, ||
, !
,
下面表格列出, 其中 a = true, b = false
运算符 | 描述 | 例子 (a = true, b = false) |
---|---|---|
&&(与) | 当且仅当两个操作数都为真,条件才为真。只要有一个为假,则条件为假 | ( a && b )为 false
|
||(或) | 或操作符。其中只要有一个操作数为真是,条件为真。只有所有操作数都为假,条件为假 | ( a || b )为 true
|
!(非) | 非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | ! a 为 false
|
示例:
public class HelloWorld { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println( a && b ); //输出 false System.out.println( a || b ); //输出 true System.out.println( !a ); //输出 false } }
短路逻辑运算符
当使用 &&
或者 ||
这两个运算符时,只要第一个操作能决定整个结果时,其它的操作数就不会再执行了。
-
&&
的短路当
a = true, b = false
, 则b && a
为 false因为 && 运算符,2 个(也可以 2 个以上)都为真是,才为真
只要有一个为假,则为假
所以上面的
b && a
,第一个操作数b
为false
,则整个条件肯定是假,后面的操作数就不会再判断 a 了 -
||
的短路当
a = true, b = false
,则a || b
为 true因为 || 运算符,只要有一个为真,则条件为 true
所以
a || b
, 只判断a
的值 ,b
的值不再判断了因为
a
为true
,就决定了整个条件为true
下面的示例能更清楚的演示这个问题:
示例1 :演示 &&
的短路
public class HelloWorld { private boolean a = true; private boolean b = false; boolean getA(){ System.out.println("打印了 a "); return a; } boolean getB(){ System.out.println("打印了 b "); return b; } public static void main(String[] args) { HelloWorld hello = new HelloWorld(); // getB() && getA() ,因为 getB() 为 false,决定了整个条件为 false // 所以后面的 getA()方法就不再执行了,“打印了 a” 这句话也不会输出了 System.out.println( hello.getB() && hello.getA() ); } }
输出如下:
打印了 b false
示例2:演示 ||
的短路
public class HelloWorld { private boolean a = true; private boolean b = false; boolean getA(){ System.out.println("打印了 a "); return a; } boolean getB(){ System.out.println("打印了 b "); return b; } public static void main(String[] args) { HelloWorld hello = new HelloWorld(); // getA() && getB() ,因为 getA() 为 true,决定了整个条件为 true // 所以后面的 getB()方法就不再执行了,“打印了 b” 这句话也不会输出了 System.out.println( hello.getA() || hello.getB() ); } }
输出如下:
打印了 a true
5 赋值运算符
Java赋值运算符,顾名思义,就是给变量赋值的。下面是Java的支持的赋值运算符
下面表格中,int a = 10, int b = 20
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | int c = a + b , 把 a + b 的值 赋值给 c ,此时 c = 30 |
+= | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | a += b 等价于 a = a + b ,此时 a = 30 |
-= | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | a -= b 等价于 a = a - b , 此时 a = -10 |
*= | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | a *= b 等价于 a = a * b ,此时 a = 200 |
/= | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | b /= a 等价于 b = b / a , 此时 b = 2 |
%= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | b %= a 等价于 b = b % a ,此时 b = 0 |
<<= | 左移位赋值运算符 | a << = 2等价于 a = a << 2 |
>>= | 右移位赋值运算符 | a >> = 2等价于a = a >> 2 |
&= | 按位与赋值运算符 | a&= 2等价于a = C&2 |
^ = | 按位异或赋值操作符 | a ^ = 2等价于a = a ^ 2 |
|= | 按位或赋值操作符 | a |= 2 等价于a = a |2 |
示例:
public class HelloWorld { public static void main(String[] args) { int a = 10; int b = 20; int c0 = a + b; // c0 = 30 int c1 = 3 ; c1 += a; // c1 = 13 int c2 = 13; c2 -= a; // c2 = 3 int c3 = 3; c3 *= a; // c3 = 30 int c4 = 20; c4 /= a; // c4 = 2; int c5 = 23; c5 %= a; // c5 = 3 int c6 = 0; c6 = a <<= 2; // c6 = 40 int c7 = 0; c7 = a >>= 2; // c7 = 10 int c8 = 0; c8 = a &= 2; // c8 = 2 int c9 =0; c9 ^= 2; // c9 = 2 int c10 = 0; c10 |= 2; // c10 = 2 } }
6 其它运算符
1 三目运算符 ?:
该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
一个简单的例子
public class HelloWorld { public static void main(String[] args) { //学生分数 int score = 75; //是否及格, 当分数大于60,isPass 就取true, 否则为 false boolean isPass = score > 60 ? true : false; System.out.println( isPass ); // 输出 true } }
语法如下:
variable x = (expression) ? value if true : value if false
再对着上面的例子,就容易理解了。
主要就是前面条件为真,就取 问号后面的值,否则,就取 冒号 后面的值
2 instanceof 运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
object instanceof var
,返回的是一个boolean值
如下面示例:
public class HelloWorld { public static void main(String[] args) { Object obj = "www.helloworld.net"; //判断 obj 是否是 String 类型的变量 boolean b = obj instanceof String; System.out.println( b ); // 输出 true } }
7 Java运算符优先级
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级问题。
就算数学中的加减乘除一样,有加法有乘法,先算乘法,后算加法一样,有括号的先算括号的。
Java的运算符也是有一个优先级的。
下表按照优先级从高到低排列。如下:
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr-- | 从左到右 |
一元 | ++expr --expr + - ~ ! | 从右到左 |
乘性 | * / % | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | >>= <<= | 左到右 |
相等,不等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | ||
逻辑与 | && | 左到右 |
逻辑或 | ||
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = |
逗号 | , | 左到右 |
小结
Java的运算符有以下几种:
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
运算符之间有优先级