算术运算符
基本四则运算符: + - * / %
四则运算应该大家都很熟悉,值得注意的是除法:
1、int / int 的到的结果只能是int,如需得到小数则要借用double类型来计算
如:
int a = 1;
int b = 2;
System.out.println(a / b);
// 结果为 0
//如要得到0.5,得把其中一个转为double
System.out.println((double)a / b);
运行结果:
2、0不能作为除数
int a = 1;
int b = 0;
System.out.println(a / b)
// 运行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Test.main(Test.java:5)
3、%是取余符号不仅能对int取模,也能对double取模
System.out.println(11.3 %4);
运行结果:
复合运算符
运算符 | 描述 | 例子 |
+= | 将左边操作数与右边操作数的值相加后,在赋值给左边操作数 | a += 1 等价于 a = a + 1 |
-= | 将左边操作数与右边操作数的值相减后,在赋值给左边操作数 | a -= 1 等价于 a = a - 1 |
*= | 将左边操作数与右边操作数的值相乘后,在赋值给左边操作数 | a *=1 等价于 a = a * 1 |
/= | 将左边操作数与右边操作数的值相除后,在赋值给左边操作数 | a /= 1 等价于 a = a / 1 |
自增/自减操作符
++
可以置于操作数前面,也可以放在后面,如:
++i;
i++ ;
++i
表示,i自增1后再参与其它运算;
而i++
则是i参与运算后,i的值再自增1。
自减运算符--
与之类似,只不过是变加为减而已,故不重述。
示例:
int a = 10;
int b = ++a;
System.out.println(b);
int c = a++;
System.out.println(c);
运行结果:
因此:如果不去自增运算的表达式的返回值,则后置自增和前置自增没有区别;如果去表达式的返回值,则前置自增的返回值是自增后的值,后置自增的返回值是自增之前的值。
关系运算符
关系运算符主要有六个:
== (等于) !=(不等于) <(小于) >(大于) <=(小于等于) >=(大于等于)
示例:
int a = 10;
int b = 20;
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);
运行结果:
从运行结果得出:关系运算符的表达式的返回值都是boolean类型。
逻辑运算符
&&(逻辑与)
||(逻辑或)
!(逻辑非)
逻辑与&&
规则:两个表达式都为true,结果为true,否则结果为false。
示例:
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b < c);
运行结果:
逻辑或||
规则:两个表达式都为false,结果为false,否则结果为true。
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b < c);
逻辑非!
操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, 只有一个操作数)
int a = 10;
int b = 20;
System.out.println(!(a < b));
运行结果:
短路求值
1.对于&&,如果左侧表达式为false,则表达式的返回值为false,则右侧的表达就不会执行。
2.对于||,如果左侧表达式为true,则整个表达式的返回值为true,同样右侧的表达式不执行。
示例:
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
运行结果:
我们知道10/0
在编译器内会报错,但是短路求值的规则,所以没有执行该语句,所以编译器就不会报错。
位运算
位操作:是按二进制位进行运算。
操作符 | 功能 |
& | 按位与:如果两个二进制位都是1,则结果为1,否则结果为0。 |
| | 按位|:如果两个二进制位都是0,则结果为0,否则结果为1。 |
~ | 按位取反~:如果二进制位为0,则转为1,为1则转为0 |
^ | 按位异或^:如果两个数字的二进制位相同,则异或为0,相异结果为1。 |
移位运算
java中的移位运算符有三个:(都是按照二进制位进行运算)
<< >> >>>
左移<<
最左侧位不要了,最右侧补0.
示例:
public static void main(String[] args) {
int a = -20;
int b = 20;
System.out.printf("%d\n", a << 1);
System.out.println((b << 1));
}
运行结果:等效于乘以2.
右移>>
最右侧不要了,左侧补符号位(正数补0,负数补1);
示例:
int a = -8;
int b = 20;
System.out.printf("%d\n", a >> 1);
System.out.println((b >> 1));
运行结果:等效于除2.
无符号右移>>>
最右侧不要了,最左侧补0;
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的)
7fffffff
Tips:
- 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
- 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
- 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
- 移动负数位或者移位位数过大都没有意义
条件运算符(三目操作符)
java中唯一的一个三目操作符。
用法:
表达式1? 表达式2 : 表达式3
其中表达式1位boolean表达式,若表达式1为真(true),执行表达式2,若 表示1为假(false),则执行表达式3。
示例:
//求两个整数的最大值
int a = 10;
int b = 20;
int max = (a > b) ? a : b;
//运行结果 max = 20;
运算符的优先级
运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可