计算机的最基本用途之一就是执行数学运算,做为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。java
咱们把运算符具体分为:算数运算符,比较运算符,逻辑运算符,位运算符,赋值运算符,条件运算符,instanceof 运算符。编码
算术运算符用在数学表达式中,它们的做用和在数学中的做用同样。spa
操做符 | 名称 | 描述 |
---|---|---|
+ | 加法 | 相加运算符两侧的值 |
– | 减法 | 左操做数减去右操做数 |
* | 乘法 | 相乘操做符两侧的值 |
/ | 除法 | 左操做数除以右操做数 |
% | 取余 | 左操做数除以右操做数的余数 |
++ | 自增 | 操做数的值增长1 |
— | 自减 | 操做数的值减小1 |
如下代码:code
public static void main(String[] args) { int a = 5; int b = 10; System.out.println("“+” 运算:"+(a+b)); System.out.println("“-” 运算:"+(a-b)); System.out.println("“*” 运算:"+(a*b)); System.out.println("“/” 运算:"+(a/b)); System.out.println("“%” 运算:"+(a%b)); System.out.println("“++” 运算:"+(a++)); System.out.println("“--” 运算:"+(a--)); }
输出结果:
“+” 运算:15
“-” 运算:-5
“*” 运算:50
“/” 运算:0
“%” 运算:5
“++” 运算:5
“–” 运算:6对象
另外,进行除法运算时,若两个操做数是整型的,结果也会是整型的,舍弃掉小数部分;若是有一个数是浮点数,结果将自动转型为浮点型。进行取余运算时,若两个操做数是整型的,结果也会是整型的,若是有一个数是浮点数,结果将自动转型为浮点型token
**其中,自加和自减运算符针对一个数值自己的运算;且前缀自增自减(++a,–a)是先进行自增或者自减运算,再进行表达式运算。后缀自增自减(a++,a–)是先进行表达式运算,再进行自增或者自减运算。咱们给出例子:数学
public static void main(String[] args) { int a = 5; int b1 = 10; int b2 = 10; int c1 = 10; int c2 = 10; System.out.println("前缀自增b1参与表达式计算后值为:"+(a*++b1)); System.out.println("后缀自增b2参与表达式计算后值为:"+(a*b2++)); System.out.println("前缀自减b1参与表达式计算后值为:"+(a*--c1)); System.out.println("后缀自减b2参与表达式计算后值为:"+(a*c2--)); }
比较运算符的结果必定是boolean类型,也叫关系运算符string
操做符 | 名称 | 描述 |
---|---|---|
> | 大于 | 相加运算符两侧的值 |
< | 小于 | 左操做数减去右操做数 |
== | 等于 | 相乘操做符两侧的值 |
>= | 大于等于 | 左操做数除以右操做数 |
<= | 小于等于 | 左操做数除以右操做数的余数 |
!= | 不等于 | 操做数的值增长1 |
如,it
public static void main(String[] args) { int a = 5; int b = 10; System.out.println(a > b ); System.out.println(a < b ); System.out.println(a == b ); System.out.println(a >= b );**** System.out.println(a <= b); System.out.println(a != b ); }
输出结果:
false
true
false
false
true
true
注意,比较运算符“==”用来比较基本数据类型是比较的是值是否相等,比较引用数据类型是比较的是引用是否相等,引用数据类型用equals()来比较字面量是否相等。io
操做符 | 名称 | 描述 |
---|---|---|
&& | 短路与 | 当且仅当两个操做数都为真,条件才为真。 |
& | 逻辑与 | 当且仅当两个操做数都为真,条件才为真。 |
| | | 短路或 | 若是任何两个操做数任何一个为真,条件为真。 |
| | 逻辑或 | 若是任何两个操做数任何一个为真,条件为真。 |
! | 逻辑非 | 用来反转操做数的逻辑状态。若是条件为true,则逻辑非运算符将获得false |
逻辑运算符中,“与”运算符和“或”运算符都有两个,“&&”咱们称之为短路与。“||”咱们称之为短路或,短语与“&&”从左到右一次判断,遇到false则中止判断,得出结果未false;逻辑与“&”从左到右一次判断,直至结束。短语或“||”从左到右一次判断,遇到true则中止判断,得出结果未true;逻辑或“|”从左到右一次判断,直至结束。咱们给出例子:
public static void main(String[] args) { int a = 5; int b = 10; //短路与,前一个表达式的值为false,不在判断下一个表达式,故a++不执行 System.out.print((a>b)&&(a++ == 1)); System.out.println(" a的值:"+ a); //逻辑与,前一个表达式的值为false,仍依次判断下一个表达式 System.out.print((a>b)& (a++ == 1)); System.out.println(" a的值:"+ a ); //短路或,前一个表达式的值为true,不在判断下一个表达式,故a++不执行 System.out.print((a<b)|| (b++ == 1)); System.out.println(" b的值:"+ b ); //逻辑或,前一个表达式的值为true,仍依次判断下一个表达式 System.out.print((a<b)| (b++ == 1)); System.out.println(" b的值:"+ b ); //非运算符 System.out.print(!(a<b)); }
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符做用在全部的位上,而且按位运算。
操做符 | 名称 | 描述 |
---|---|---|
& | 按位& | 若是相对应位都是1,则结果为1,不然为0 |
| | 按位或 | 若是相对应位都是0,则结果为0,不然为1。 |
^ | 异或 | 若是相对应位值相同,则结果为0,不然为1 |
~ | 按位取反 | 翻转操做数的每一位,即0变成1,1变成0。结果为: -(X+1) |
<< | 按位左移 |一般格式为:value << num,value按位左移num位 | |
>> | 有符号按位右移 | 一般格式为:value >> num,value按位右移num位。 |
>>> | 无符号按位右移 | 一般格式为:value >> num,value按右移num位,移动获得的空位以零填充。 |
咱们给出例子:
public static void main(String[] args) { int a= 10; int b = 20; //a转化成二进制表示为:1010;b转化为二进制表示为:10100 //按位运算时,咱们把a表示为:01010 System.out.println(a&b); //按位与运算,有零则为零,都为1则表示为1,与的结果为:00000,即十进制的0 System.out.println(a|b); //按位或运算,有1则为1,都为0则表示为0,或的结果为:11110,即十进制的30 System.out.println(a^b); //按位或运算,对应位置相同则为0,不然为1,取反的结果为:11110,即十进制30 }
运行结果:
0
30
30
下面,咱们来讲一下按位取反,计算机内部都是以补码的形式在作数学运的,而咱们所用的编码规则,例如原码、反码则是咱们自定义的,用来方便和计算机中的补码来造成转化。故而,咱们在进行按位取反是要把原码或者反码转化成补码的形式。正数的反码和补码与原码相等; 负数的反码是符号位不变,其他按位取反,补码为反码+1。负数的最高符号位为1。
如,
public static void main(String[] args) { int a= 10; int b= -10; System.out.println(~a); System.out.println(~b); }
运行结果为:-11,9。 分析以下: a为正数,其补码形式与原码相同,表示为:00001010,按位取反后为11110101,注意,此时为补码形式,转化为反码表示为,11110100,再转化为原码表示为:10001011,即十进制的-11.一样的,b为负数,其补码表示为:11110110,按位取反后为00001001,此时依然为补码形式,转化为原码即其自己00001001,即十进制的9。故,按位取反后的结果可表示为-(X+1)
接下来,咱们给出例子来看一下位移运算符
public static void main(String[] args) { int a= 10; int b = -10; //int为4个字节,也就是32位,为了简化a表示为:00001010, // b为负数咱们表示为:1000 0000 0000 0000 0000 0000 0000 1010 //b的补码形式为 1111 1111 1111 1111 1111 1111 1111 0110 System.out.println( a<<1 ); //按位左移,原则舍弃高位,低位补零表示为:00010100,即20 System.out.println(a>>1); //按位右移,原则舍弃低位,高位补零表示为:00000101,即5 System.out.println(a>>1); //按位右移,原则舍弃低位,高位补零表示为:10000101,即5 System.out.println(a>>>1); //按位右移,原则舍弃低位,高位补零表示为:0000010,即5 System.out.println(b>>1); //有符号按位右移,原则舍弃低位,符号位不变,其他高位补零原码表示为: // 1000 0000 0000 0000 0000 0000 0000 0101,即-5 System.out.println(b>>>1); //无符号按位右移,原则舍弃低位,高位补零(补码=原码)表示为: // 0111 1111 1111 1111 1111 1111 1111 011,即十进制的,2147483643 }
输出结果:
20
5
5
5
-5
2147483643
总结一下,原则上,按位左移时,原则舍弃高位,低位补零;有符号按位右移,原则舍弃低位,符号位不变,其他高位补零;无符号按位右移,原则舍弃低位,高位补零。再次强调,作位移运算时,是按补码来进行运算的
操做符 | 名称 | 描述 |
---|---|---|
= | 赋值 | 右操做数的值赋给左侧操做数 |
+= | 加和赋值 | 左操做数和右操做数相加赋值给左操做数 (a+=b 等同于 a = a+b) |
-= | 减和赋值 | 左操做数和右操做数相减赋值给左操做数 (a-=b 等同于 a = a-b) |
*= | 乘和赋值 | 左操做数和右操做数相乘赋值给左操做数 (a*=b 等同于 a = a*b) |
\/= | 除和赋值 | 左操做数和右操做数相除赋值给左操做数 (a/=b 等同于 a = a/b) |
(%)= | 取模和赋值 | 左操做数和右操做数取模后赋值给左操做数 (a%=b 等同于 a = a%b) |
<< = | 左移位赋值 | 左移位赋值运算符 (a<<=b 等同于 a = a<<b) |
>> = | 右移和赋值 | 右移位赋值运算符 (a>>=b 等同于 a = a>>b) |
^ = | 除和赋值 | 按位与赋值运算符 (a^=b 等同于 a = a^b) |
&= | 除和赋值 | 按位异或赋值操做符 (a&=b 等同于 a = a&b) |
| = | 除和赋值 | 按位或赋值操做符 (a|=b 等同于a = a|b) |
基本的赋值运算符是“=”。他的优先级别低于其余的运算符,因此对该运算符每每最后读取,他不是“等于”,它的做用是将一个表达式的值赋给一个左值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须可以被修改,不能是常量,以上其余是复合的赋值运算符,又称为带有运算的赋值运算符,也叫赋值缩写。等同与先按运算符运算后再把运算结果付给左值(见表格)。具体运算方法上边儿已经罗列,此处再也不赘述
条件运算符也叫三目运算符
语法:
(条件) ? 结果一 : 结果二;
当条件成立,执行结果一,不然执行结果二。,“?”前的值必须是true或flase
咱们给出例子:
if(a<b) min=a; else min=b; 能够用下面的三目运算符来处理 min = a<b ? a : b;
instanceof运算符能够肯定对象是否属于一个特定的类.该运算符是二目运算符,左边的操做元是一个对象,右边是一个类,当左边的对象是右边的类或子类建立的对象时,该运算符运算的结果是true,不然是false。,使用格式:( Object reference variable ) instanceof (class/interface type)
咱们给出例子:
public static void main(String[] args) { String a = "name"; System.out.println(a instanceof String); System.out.println(a instanceof Object); }
输出结果:true,true
在一个表达式中可能包含多个有不一样运算符链接起来的、具备不一样数据类型的数据对象;因为表达式有多种运算,不一样的运算顺序可能得出不一样结果甚至出现错误运算错误,由于当表达式中含多种运算时,必须按必定顺序进行结合,才能保证运算的合理性和结果的正确性、惟一性。相同优先级中,按结合顺序计算。
一般优先级由高到底的顺序依次是:1. 括号级别最高,逗号级别最低;2. 单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。3. 除了单目运算符、赋值运算符和条件运算符,其余的运算符都是从左到右结合的。