在Java中,运算符可以分为以下几种:算术运算符(+ - * /)、关系运算符(< > ==)、逻辑运算符(&& || !)、位运算符(& | ~)、移位运算符(<< >> >>>)以及条件运算符。
算术运算符
1.基本四则运算(+ - * /)
int a = 20;
int b = 10;
int c = 0;
System.out.println(a + b);//30
System.out.println(a - b);//10
System.out.println(a * b);//200
System.out.println(a / b);//2
System.out.println(a % b);//0
System.out.println(a / 0);//当取模或者进行除法运算时,被操作数不能为0
System.out.println(a % 0);//也能对小数进行取模运算,但是没有意义
2.增量运算符(+= -= *= /= %=)(只有变量才能用,常量不能用)
int a = 1;
a += 3;//相当于a = a + 3,即a = 1 + 3
System.out.println(a);//4
int b = 5;
b -= 1;//相当于b = b - 1,即b = 5 - 1
System.out.println(b);//4
int c = 2;
c *= 3;//相当于c = c * 3,即c = 2 * 3
System.out.println(c);//6
int d =10;
d /= 5;//相当于d = d / 5,即d = 10 / 5
System.out.println(d);//2
int e = 11;
e %= 2;//相当于e = e % 2,即e = 11 % 2
System.out.println(e);//1
3.自增/自减运算符(只有变量才能用,常量不能用)
++ 是给变量+1,--是给变量-1
int a = 5;
System.out.println(a++);//5 后置++,先进行输出再进行++
System.out.println(++a);//7 前置++,先进行++后进行输出
前置++和后置++,在单独使用的时候没有区别;但是在混合使用时,后置++是先进行运算再进行++,而前置++是先进行++后进行运算。
关系运算符
关系运算符主要有六种:== != < > <= >=,其计算结果是true或者false
注:
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
int c = 5;
double d = 5.4;//int与double可以进行比较,都是数值型
System.out.println(c == d);//false
System.out.println(c <= d);//true
char e = 'a';
int n = 30;//char和int也可以进行比较,但是比较会把‘a’看成‘a’的编码进行比较
System.out.println(e == n);//false
逻辑运算符
逻辑运算符有三个:&& || !,返回值是true或者false
&&(逻辑与)——表达式1&&表达式2,左右表达式都为真时结果才是真,其他情况都为假
||(逻辑或)——表达式1||表达式2,左右表达式只要有一个是真,结果就是真,都为假时结果才为假
!(逻辑非)——!表达式,当表达式为真时,!表达式为假,当表达式为假时,!表达式为真
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2);//true
System.out.println(a > 1 && b == 2);//false
System.out.println(a < 1 && b > 2);//false
System.out.println(a == 1 || b == 2);//true
System.out.println(a == 1 || b > 2);//true
System.out.println(a < 1 || b < 2);//false
System.out.println(!(a == 1));//false
System.out.println(!(b != 2));//true
短路求值
逻辑与和逻辑或的运算遵守短路求值的规则:
System.out.println(10 == 10 || 10 / 0 == 0);//true
System.out.println(10 > 20 && 10 / 0 == 0);//false
按照标准来说10 / 0应该会出错,但是在该程序中并没有抛出异常,这是因为&&和||遵守短路求值的规则,对于&&来说,如果第一个表达式为假则不计算第二个表达式的真假,直接返回结果假;对于||来说,如果第一个表达式为真则不计算第二个表达式的真假,直接返回结果真。
位运算符
位运算符有四个:& | ~ ^,位运算符主要是按二进制运算。(0x——十六进制,0o——八进制,0b——二进制)
&(按位与)——如果两个二进制位都是1,则结果为1,否则为0
|(按位或)——如果两个二进制位都是0,则结果为0,否则为1
~(按位取反)——如果该位是0则转为1,如果该位是1则转为0
^(按位异或)——如果两个数字的二进制位相同,则结果为0,否则为1
int a = 10;//0000 1010
int b = 20;//0001 0100
System.out.println(a & b);//0000 0000
System.out.println(a | b);//0001 1110 = 30
System.out.println(~a);//包括符号位按位取反 -11
System.out.println(~b);//包括符号位按位取反 -21
System.out.println(a ^ b);//0001 1110 = 30
移位运算符
移位运算符有三个:<< >> >>>,移位运算符里没有<<<(无符号左移)
<<(左移)——最左侧位不要,最右侧补0
>>(右移)——最右侧位不要,最左侧补符号位
>>>(无符号右移)——最右侧不要了,最左侧补0
int a = 10;
System.out.println(a << 2);//0000 0000 0000 0000 0000 0000 0000 1010 -> 00 0000 0000 0000 0000 0000 0000 1010 00 = 40
System.out.println(a >> 2);//0000 0000 0000 0000 0000 0000 0000 1010 -> 00 0000 0000 0000 0000 0000 0000 0010 10 = 2
正整数左移1位相当于给原来的数乘2,即x << 1 = x * 2,左移n位,相当于给原来的数 乘2的n次方;正整数右移1位相当于原来的数除以2,即x >> 1 = x / 2,右移n位,相当于给原来的数除以2的n次方。
所以在某些乘2或者除以2的问题上,可以直接使用移位运算符,左移或者右移1位!
条件运算符
条件运算符时一个三目运算符且只有一个:表达式1 ? 表达式2 : 表达式3,当表达式1为true时,整个表达式的值为表达式2的值,当表达式1为false时,整个表达式的值为表达式3的值。
注:
int a = 10;
int b = 20;
a > b ? a : b;//会报错
int max = a > b ? a : b;
System.out.println(max);
运算优先级
运算符之存在有优先级,但是一般在需要确定计算的顺序时,一般直接加()就好 。
举个例子:算术运算符的优先级高于移位运算符
int a = 20;
int b = 10;
//结果为60 -> a + (a - b) = 30,30 << 1 = 60
System.out.println(a + (a - b) << 1);
//结果时40 -> (a - b) << 1 = 10 << 1 = 20,20 + 20 = 40
System.out.println(a + ((a - b) << 1));