运算符就是对操作数进行操作的符号,例如a+b
中a
和b
是操作数,+
是运算符。Java中运算符和C语言中的运算符基本一致(当然也有自己的特点)。运算符主要有以下几类
+
、-
、*
、\
、%
①:两个int
相除时结果仍为int
,同时还会向下取整,这一点很多人容易犯错
public class TestDemo {
public static void main(String[] args) {
int a = 3;
int b = 2;
System.out.println(a / b);//实际输出1,舍弃小数位
}
}
②:当两侧操作数类型不一致时,会向类型大的提升,这里尤其注意/
public class TestDemo {
public static void main(String[] args) {
// 类型提升
System.out.println(1+0.2);//1已经被提升为了double,输出1.2
//注意/运算符
System.out.println(5/2);//输出2
System.out.println((float)5/2);//输出2.5
System.out.println(5/(float)2);//输出2.5
System.out.println((float)(5/2));//输出2.0
}
}
③:\
、%
运算时,右操作数不能为0
public class TestDemo {
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
}
④:%
也可以操作负数
public class TestDemo {
public static void main(String[] args) {
System.out.println(10 % 3);
System.out.println(10 % -3);
System.out.println(-10 % 3);
System.out.println(-10 % -3);
}
}
+=
、-=
、*=
、\=
、%=
public class TestDemo {
public static void main(String[] args) {
int a = 1;
a+=2; //相当于a=a+2
System.out.println(a);
int b = 1;
b-=2; //相当于b=b-2
System.out.println(b);
int c = 1;
c*=2; //相当于c=c*2
System.out.println(c);
int d = 1;
d/=2; //相当于d=d/2
System.out.println(d);
int e = 3;
e%=2; //相当于e=e%2
System.out.println(e);
}
}
++
、--
public class TestDemo {
public static void main(String[] args) {
int a = 1;
System.out.println(a++);//先使用故输出1,然后a变为2
System.out.println(++a);//先++变为3然后输出
}
}
==
、!=
、<
、>
、 <=
、 >=
=
和==
true
或false
a<b<c
这样的操作public class TestDemo {
public static void main(String[] args) {
int a = 1;
int b = 2;
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
类型
规则为:遇假则假、全真则真
运算时从左到右依次判断,一旦某个表达式为false
,则结果直接返回false
,后续表达式不再执行(“短路”现象)
public class TestDemo {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2);
System.out.println(a == 1 && b > 100);
System.out.println(a > 100 && b == 2);
System.out.println(a > 100 && b > 100);
}
}
短路现象
public class TestDemo {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(((a > b) && ((19 / 0) == 0))); //a>b返回false,直接返回false,虽然后面除数为0,但是不执行
}
}
||
||
左右两侧必须都是boolean
类型true
,则结果直接返回true
,后续表达式不再执行(“短路”现象)public class TestDemo {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2);
System.out.println(a == 1 || b > 100);
System.out.println(a > 100 || b == 2);
System.out.println(a > 100 || b > 100);
}
}
短路现象
public class TestDemo {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(((a < b) || ((19 / 0) == 0))); //a<b返回true,直接返回true,虽然后面除数为0,但是不执行
}
}
!
后面只能接布尔表达式,而不能像C语言一样出现类似于!1
、!0
的操作public class TestDemo {
public static void main(String[] args) {
int a = 1;
System.out.println(!(a == 1)); // a == 1 为true,取个非就是false
System.out.println(!(a != 1)); // a != 1 为false,取个非就是true
}
}
&
、|
、^
、~
关于位运算符这里就不详细展开了,只说一下具体规则。位运算符会针对比特位进行运算
&
):如果两个二进制位都是 1, 则结果为 1, 否则结果为 0|
):如果两个二进制位都是 0, 则结果为 0, 否则结果为 1^
):如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1^
):如果该位为 0 则转为 1, 如果该位为 1 则转为 0<<
、>>
、<<<
<<
:最左侧不要,最右侧补0;左移
N
N
N位,相当于乘以
2
N
2^{N}
2N<<
:最右侧不要,最左侧补符号位(正数补0、负数补1);右移
N
N
N位,相当于除以
2
N
2^{N}
2N>>>
:最右侧不要,最左侧补0public class TestDemo {
public static void main(String[] args) {
//左移
int a = 0x10;
System.out.printf("%x\n", a);
System.out.printf("%x\n", a << 1);
System.out.println("---------------------------------");
//右移
int b = 0x10;//正数
System.out.printf("%x\n", b);
System.out.printf("%x\n", b >> 1);
int c = 0xffff0000;//负数
System.out.printf("%x\n", c);
System.out.printf("%x\n", c >> 1);
System.out.println("---------------------------------");
//无符号右移
int d = 0xffffffff;//负数
System.out.printf("%x\n", d);
System.out.printf("%x\n", d >>> 1);
}
}
表达式1?表达式2:表达式3
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
int max = a>b?a:b;
System.out.println(max);
}
}