7.java运算符
一、运算符(operator)
运算时会自动向上转型,除了short和byte会自动转为int
Java运算符按功能可分为:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和条件运算符。
| 操作符 | 描述 |
|---|---|
| + | 加法 - 相加运算符两侧的值 |
| - | 减法 - 左操作数减去右操作数 |
| * | 乘法 - 相乘操作符两侧的值 |
| / | 除法 - 左操作数除以右操作数 |
| % | 取余 - 左操作数除以右操作数的余数 |
| ++ | 自增: 操作数的值增加1 |
| -- | 自减: 操作数的值减少1 |
算术运算符
算术运算符包括加(+)、减(-)、乘(*)、除(/)、取模(%)、自增(++)、自减(--),通过算术运算符完成对整型和浮点型数据的算术计算。
- 若两个数据不是同类型,运算时较小容量的数据类型会自动向大容量数据类型转型,然后再进行计算。但是只有short、byte、char会自动转换为int型,然后再进行计算。
- 同一类型的数据运算,结果的类型与参数的类型一致。因此计算时要考虑数据溢出的问题。
- 关于++和--的示例如下,
int a = 4;
int b = 2;
int c = a++;
System.out.println(c); //输出:4,此时++在变量名后面,因此先将a赋值给c,然后到下一行再执行a=a+1。
System.out.println(a); //输出:5
int d = a--;
System.out.println(d); //输出:5,此时--在变量名后面,因此先将a赋值给d,然后到下一行再执行a=a-1。
System.out.println(a); //输出:4
int e = ++a;
System.out.println(e); //输出:5,此时++在变量名前面,因此先执行a=a+1,然后再赋值给e。
System.out.println(a); //输出:5
int f = --a;
System.out.println(f); //输出:4,此时--在变量名前面,因此先执行a=a-1,然后再赋值给e。
System.out.println(a); //输出:4
int g = a+++a+++a;
System.out.println(g); //输出:15
//扩展 幂运算(2的3次方)
double h = Math.pow(2,3); //此方法的返回值是double
System.out.println(h); //输出:8.0
扩展:
int a = 1;
int b = 2;
System.out.println(a+b+""); //输出:3。由于先执行了a+b,所以结果为字符串3
System.out.println(""+a+b); //输出:12.由于先执行了""+a,此时会自动转型为字符串类型进行拼接。
关系运算符
下表为Java支持的关系运算符
表格中的实例整数变量A的值为10,变量B的值为20:
| 运算符 | 描述 | 例子 |
|---|---|---|
| == | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
| != | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
| > | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 |
| < | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
逻辑运算符
逻辑运算符有三种:与(&&)、或(||)、非(!)
下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假
| 操作符 | 描述 | 例子 |
|---|---|---|
| && | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
| ! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
- 短路运算。&&在运算时,如果前面为false,那么就不会执行后面的语句,这个行为称为短路。实例如下
int a = 4;
int b = 2;
boolean c = a<0 && (b++>0);
System.out.println(c); //输出:false
System.out.println(b); //输出:2。由于a不小于0,所以短路了,就不会执行后面的语句,因此b没有自增,还是2
位运算
位运算符有其中:&、|、^、~、<<、>>、>>>
位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100 //两个都为1,结果为1。其余都是0。
A | B = 0011 1101 //只要有1个为1,结果为1。
A ^ B = 0011 0001 //两个相等为0,其余都为1。
~A= 1100 0011 //取反。
| 操作符 | 描述 | 例子 |
|---|---|---|
| & | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
| ^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
| 〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
| << | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
| >> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
| >>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
扩展:
//如何计算2的三次方效率最高?2<<3
0000 0000 0000 0010 2
0000 0000 0000 0100 4
0000 0000 0000 1000 8
0000 0000 0001 0000 18
只需要将二进制的2中1所在的位置左移3位,就可以得到二进制的18。
赋值运算符
| 操作符 | 描述 | 例子 |
|---|---|---|
| = | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
| + = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
| - = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
| * = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
| / = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
| (%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
| << = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
| >> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
| &= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
| ^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| | = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
条件运算符/三元运算符
//数据类型 变量名 = 表达式 ? 变量值A :变量值B
variable x = (expression) ? valueA if true : valueB if false;
//如果表达式为真,那么值为A,否则为B
运算符优先级

注:
鸣谢《狂神说》,免费java学习地址:https://www.kuangstudy.com/
浙公网安备 33010602011771号