Java语言中的运算符
Java语言中的运算符包括:
赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符以及条件运算,接下来一类一类的看
1、赋值运算符
=
int a = 10;//给一个变量赋值
2、算术运算符
基本四则运算符:+ - * / %
+ - * / 很简单,在写代码的时候要注意类型转换和数值提升问题,在进行 / 运算的时候,0不能作为除数
int a = 1;
int b = 0;
System.out.println(a/b);//会报异常,ArithmeticException
% 取余运算,就是求一个数除以另一个数的余数,可以对整型和浮点型进行计算
int c = 3;
int d = 2;
float e = 11.5f;
float f = 2f;
System.out.println(c % d);//输出1
System.out.println(e % f);//输出1.5
负数求余还是负数
增量赋值运算符:+= -= *= /= %=
int a = 1;
a += 1;//相当于 a = a + 1;
System.out.println(a);//结果为2
int b = 2;
b -= 1;//相当于 b = b-1;
System.out.println(b);//结果为1
其他的也以此类推
自增、自减运算符:++ –
int a = 1;
a++;//相当于a = a + 1;
System.out.println(a);//结果为2
int b = ++a;//相当于 b = a + 1;
System.out.println(b);//结果为3
3、关系运算符
== != < > <= >=
关系运算符的表达式返回值都是 boolean 类型的数据
int a = 10;
int b = 20;
System.out.println(a == b);//输出false
System.out.println(a != b);//输出true
System.out.println(a < b );//输出true
System.out.println(a > b);//输出false
System.out.println(a <= b);//输出 true
System.out.println(a >= b);//输出 false
4、逻辑与算符
&& || !
逻辑运算符的操作数和返回值都是boolean类型(操作数一般是关系运算符的结果)
&&(与):两个表达式结果都为 true ,结果才是 true, 否则结果为 false
int a = 10;
int b = 20;
int c = 30;
//a<b 结果为 true, b<c 结果也为 true, 所以输出结果为 true
System.out.println(a<b && b<c);
//a<b 结果为 true, b>c 结果为false, 所以输出结果为 false
System.out.println(a<b && b>c);
//a>b 结果为 false, b>c 结果为false, 所以输出结果为 false
System.out.println(a>b && b>c);
||(或):两个操作数都是 false 结果才为 false ,否则结果为 true
int a = 10;
int b = 20;
int c = 30;
//a<b 结果为 true, b<c 结果也为 true, 所以输出结果为 true
System.out.println(a<b || b<c);
//a<b 结果为 true, b>c 结果为false, 所以输出结果为 true
System.out.println(a<b || b>c);
//a>b 结果为 false, b>c 结果为false, 所以输出结果为 false
System.out.println(a>b || b>c);
!(非):操作数为 false ,输出结果为 true,操作数为 true ,输出结果为 false
int a = 10;
int b = 20;
int c = 30;
//a<b 结果为 true,所以输出结果为 false
System.out.println(!(a<b));
&& 和 || 遵守短路求值的规则
举个例子:
System.out.println(10>20 && 10/0 == 0);//输出false,且没有抛异常
我们知道 0 做除数,系统会抛出ArithmeticException,但是打印时系统并没有抛出异常,这说明 10/0 根本没有执行呀,所以系统判定10>20 为false之后整体的结果一定为false,就没有执行右侧的表达式。
所以在通过左侧表达式的结果就能判定整体结果时,就不会执行右侧表达式,这就是短路求值
& 和 | 这俩运算符在操作数值为 boolean 类型时,也是逻辑运算符,但是不遵守短路求值
System.out.println(10>20 & 10/0 == 0);//抛异常
5、位运算符
& | ~ ^
位操作表示按二进制位计算
&(按位与):如果两个二进制位都是1,结果为1,否则结果为0(见0为0)
int a = 10;
int b = 20;
//先把10和20 转成 01010 和 10100,再进行计算
//见0为0,所以输出结果为0
System.out.println(a & b);
|(按位或):如果两个二进制位都为0,结果为0,否则结果为1(见1为1)
int a = 10;
int b = 20;
//先把10和20转成01010和10100,见1为1,结果为11110
//输出结果为30
System.out.println(a | b);
~(按位取反):如果该二进制位为0,结果为1,如果该二进制位为1,结果为0
int a = 10;
//先把10转化为01010,再取反 10101,结果为-11
System.out.println( ~a);
^(按位异或):如果两个数字的二进制位相同,结果为0, 否则结果为1(相同为0,相异为1)
a^0 = a
a ^ b ^ b=a
int a = 10;
int b = 20;
//先把10 20转化为 01010 和 10100,进行异或运算
//相同为0 ,相异为1,结果为11110,输出结果为30
System.out.println(a ^ b);
//不使用临时变量交换两个数
// a = a + b;
// b = a - b;
// a = a - b;
// System.out.println("a = " + a);
// System.out.println("b = " + b);
//方法2(可读性很差)
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a = " + a);
System.out.println("b = " + b);
6、移位运算符
左移运算符: <<,最左侧的位去掉,最右侧补0
左移一位相当于 * 2
右移运算符: >>,最右侧的位不要,最左侧补符号位
右移一位相当于 / 2
int a = 10;
int b = 20;
System.out.println(a << 1);//输出20
System.out.println(a << 2);//输出40
System.out.println(a >> 1);//输出5
逻辑右移:>>>,最右侧的位去掉,最左侧补0
7、条件运算符
? :
cond ? exp1 : exp2
如果cond为true,表达式的返回结果为exp1的值;
如果cond为false,表达式返回结果为exp2的值
? :的运算优先级较低
int a = 10;
int b = 20;
//先算 a + 20
int ret = a > b ? b : a + 20;
System.out.println(ret);//输出30
//先算 () 里面的
int ret1 = (a > b ? a : b) + 20;
System.out.println(ret1);//输出40