JavaSE—运算符
运算符
Java支持的运算符如下:
1.算数运算符
简单的+,-,*,/,%(模运算,取余数)和数学中的意义是一样的
public class OperatorDemo {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
int add = num1 + num2;
int sub = num1 - num2;
int mul = num1 * num2;
//运算时数据类型如果不一样,向参与运算的操作数的类型中的最高精度转型
double exc = (double)num1 / num2;
//模运算,结果为num2除以num1的余数
int mod = num2 % num1;
System.out.println(add);
System.out.println(sub);
System.out.println(mul);
System.out.println(exc);
System.out.println(mod);
}
}
+ 扩展:若操作数中有字符串的话,即为字符串的拼接(从遇到的第一个字符串之后的所有数据类型都为字符串拼接)
System.out.println(10+20+"hello");
System.out.println("hello"+10+20);
虽然操作数都是一样的,但是二者的结果是不一致的,第一个的10+20还没有碰到字符串,会当作是整数运算为30,再拼接字符串为30hello,但是第一个一开始就遇到了字符串,所以后续的所有都会当作字符串拼接,所以结果为hello1020。
++(自增),--(自减)
++和--都有两种实现方式
前自增:++number
后自增:number++
(自减相同)
public class SelfIncreasing {
public static void main(String[] args) {
int a = 1;
int b = a++;
System.out.println("a = "+a);
System.out.println("b = "+b);
int a1 = 1;
int b1 = ++a1;
System.out.println("a1 = "+a1);
System.out.println("b1 = "+b1);
}
}
前后有什么区别呢?
我们可以从结果中看出,a和a1都变为了2,即操作数不管是前自增还是后自增,结果都会让自己+1
而b=1,b1=2,即说明了后自增a++会先把未自增的操作数的值先赋值,再进行自增操作;
而前自增++a会先进行自增操作,再把操作后的数进行赋值。
(自减同自增)。
2.逻辑运算符
&&:逻辑与,只有两个操作数都为true,结果才为true
||:逻辑或,只有两个操作数都为false,结果才为false(只要有一个为true,则结果为true)
!:非,!true的结果为false,!false的结果为true
按位操作:对二进制数据进行逐位运算
&:按位与,两个为1,结果才为1
|:按位或,两个为0,结果才为0(只要1有一个为1,结果为1)
^:按位亦或,相同数字得0,不同数字为1
~:按位非,1的结果则为0,0的结果则为1
左移 <<:左移多少位就乘以多少个2(但是会有溢出)
右移>>:右移多少位就除以多少个2(也会有溢出)
&&、||、!
public class LogicalOperators {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = false;
System.out.println("b1 && b2 = "+(b1 && b2));//false
System.out.println("b1 || b2 = "+(b1 || b2));//true
System.out.println("!(b1 && b2) = "+(!(b1 && b2)));//true
}
}
注意:&&和||都是短路的。&&运算中,只要第一个结果为false,则不再看第二个操作数,直接返回结果;||运算中,只要第一个结果为true,也不再看第二个操作数,直接返回结果。
int num = 1;
System.out.println(false && (num++>0));
System.out.println(num);//由于第一个为false,就不会看第二个了,也就不会执行num++了,所以num=1
System.out.println(true && (num++>0));
System.out.println(num);//由于第一个为true,所以也会看第二个操作数,所以num++被执行,所以num+2
int num1 = 1;
System.out.println(true || (num1++>1));
System.out.println(num1);//由于第一个为true,就不会看第二个了,也就不会执行num++了,所以num=1
System.out.println(false || (num1++>0));
System.out.println(num1);//由于第一个为false,所以也会看第二个操作数,所以num++被执行,所以num+2
&、|、^、~
1的二进制:01
2的二进制:10
所以
1&2 = 00(0)
1|2 = 11(3)
1^2 = 11(3)
~1 = 10(-2)这里涉及到了有符号整数取反的计算问题(无计算机组成原理的人可以自行查阅资料,不懂也无需纠结~)
1<<2 = 10(1*2=2)
2>>1 = 01 (2/2=1)
~1为什么结果为-2:
1的源码为 00000000 00000000 00000000 00000001
1的取反为 11111111 11111111 11111111 11111110
减一后得到反码为 11111111 11111111 11111111 11111101
取反后得到源码为 10000000 00000000 00000000 00000010
第一位为符号位,1代表负数,所以结果为-2。
3.赋值运算符
在Java中,=表示赋值,把右边的值赋给左边的变量
+=、-=、*=、/=等都是用于简便书写的
a+=b:表示为a=a+b;其余同理
int a = 10;
int b = 20;
a += b;//即a = a + b;
System.out.println(a);//输出结果为30
4.关系运算符
==表示相等,>=大于等于,<=小于等于
运算结果为true或者false
System.out.println(1==2);//false
System.out.println(1>=2);//false
System.out.println(1<=2);//true
5.三目运算符
a?b:c
如果a为true的话,则结果为b
如果a为false的话,则结果为c
a不仅仅可以是true或者false两个值,也可以是关系运算符连接的表达式(表达式即为合法使用运算符连接的式子)
System.out.println(true?"1":"2");
System.out.println(false?"1":"2");
System.out.println(1>2?"1":"2");
不必强制性的去记住Java的每一个运算符,只要在需要的时候想起来会用就好了~