Java学习之路——Java中的运算符
1.算术运算符
1.1基础四则运算符(+ - * / %)
Java中的基础四则运算规则比较简单,只需注意除法运算时int型除int型结果依然为int型,0不能做除数的问题。
+ - * %的基础运算
public class Text {
public static void main(String[] args) {
int a = 2 ;
int b = 3 ;
int c = 5 ;
int d = 10 ;
System.out.println(a + b); //2+3结果为5
System.out.println(d - c); //10-5结果为5
System.out.println(a * c); //2*3结果为10
System.out.println(d % b); //10%3结果为1
}
}
观察除法中可能会出现的情况
public class Text {
public static void main(String[] args) {
int a = 5 ;
int b = 2 ;
System.out.println(a/b); //结果为2
System.out.println(a/(double)b); //结果为2.5
System.out.println((double)a/b); //结果为2.5
System.out.println((double)(a/b)); //结果为2.0
}
}
除数为0的情况如下
public class Text {
public static void main(String[] args) {
int a = 5 ;
int b = 0 ;
System.out.println(a/b);
// 出现异常为:Exception in thread "main" java.lang.ArithmeticException: / by zero
}
}
求模中出现负数的情况
public class Text {
public static void main(String[] args) {
System.out.println(10 % -3); //10%-3结果为1
System.out.println(-10 % 3); //-10%3结果为-1
System.out.println(-10 % -3); //-10%-3结果为-1
}
}
1.2增量赋值运算符(+= -= *= /= %=)
这几种运算符都等价于先运算后再对自身进行赋值
a += 1 等价于a = a + 1 a -= 1 等价于a = a - 1
a *= 1 等价于a = a * 1 a /= 1 等价于a = a / 1
a %= 1 等价于a = a % 1
1.3自增/自减运算符(++ - - )
++ - -等价于自身增加1,要区分a++ 和 ++a的区别,若不取自增运算表达式的返回值,则前置和后置没有区别,如果取则前置自增的返回值是自增之后的值,后置自增的返回值是自增之前的值。
观察自增运算
public class Text {
public static void main(String[] args) {
int a = 6 ;
a = a++ ;
System.out.println("a=" + a); //结果为a=6,返回值是自增之前的值
a = ++a ;
System.out.println("a=" + a); //结果是a=7,返回值是自增之后的值
int b = a++ ;
System.out.println("a=" + a + "\tb=" + b); //结果是a=8 b=7,b收到的返回值是a自增前的值
b = ++a ;
System.out.println("a=" + a + "\tb=" + b); //结果是a=9 b=9,b收到的返回值是a自增后的值
}
}|
2.关系运算符
主要的六个关系运算符(== != < > <= >=)
关系运算符的表达式返回值都是boolean类型的,他们的作用分别是
(a == b)判断a是否等于b (a != b)判断a是否不等于b
(a < b)(a > b) 判断a是否小于(大于)b
(a <= b)(a >= b) 判断a是否小于等于(大于等于)b
观察关系运算符的返回值
public class Text {
public static void main(String[] args) {
int a = 20 ;
int b = 10 ;
System.out.println(a == b); //结果为false
System.out.println(a != b); //结果为true
System.out.println(a < b); //结果为false
System.out.println(a > b); //结果为true
System.out.println(a <= b); //结果为false
System.out.println(a >= b); //结果为true
}
}
2.逻辑运算符
主要逻辑运算符(&& || !)
逻辑运算符的操作数(操作数通常是关系运算符的结果)和返回值都是boolean类型的。
逻辑与 && 规则:两边有一个false,结果就为false。
逻辑或|| 规则:两边有一个true,结果就为true。
逻辑非! 规则:操作数为true,结果为false;操作数为false,结果为true,这是一个单目运算符,只有一个操作数。
&&和||遵守短路求值的规则
public class Text {
public static void main(String[] args) {
System.out.println(3 > 4 && 3/0 == 0);
System.out.println(3 < 4 || 3/0 == 0);
}
}
程序中有3/0,但是由于短路原因,并未运行到3/0,所有程序可以正常运行得出结果,不会抛出异常。
&和|不支持短路求值
public class Text {
public static void main(String[] args) {
System.out.println(3 > 4 & 3/0 == 0);
System.out.println(3 < 4 | 3/0 == 0);
}
}
程序抛出除数不能为0的异常,&和|并不能做到短路求值,所以一般不推荐使用。
4.位运算符
主要的位运算符号(& | ~ ^)
位运算符是按照二进制进行计算,按位运算就是按照二进制的每一位依次进行计算。四个主要运算符的规则如下
按位与&:如果两个操作数二进制位都是1结果为1,否则结果为0
按位或|: 如果两个操作数二进制位都是0结果为0,否则结果为0
按位取反~:如果操作数该位为0则转为1,该位为1则转为1
按位异或^: 如果两个数字的二进制位相同则结果为0,相异结果为1
基础的位运算
public class Text {
public static void main(String[] args) {
int a = 20 ;
int b = 10 ;
int c = 5 ;
int d = 2 ;
System.out.println(a & b); //结果为0
System.out.println(a | b); //结果为30
System.out.println( ~c); //结果为-6
System.out.println(c ^ d); //结果为7
}
}
5.移位运算
三个移位运算符(>> << >>>)
三个位运算符都是按照二进制来运算的,但是要注意,移动负数位或者移位位数过大都没有意义,会出现问题。左移1位相当于原数字2,左移n位相当于原数字2的n次方。右移一位相当于原数字/2,右移n位相当于原数字/2的n次方,由于计算机计算移位效率高于计算乘除,当某个代码正好需要乘除2的n次方时,可以使用移位运算代替。
右移>> 最右侧的位不要了 最左侧补符号位(正数补0,负数补1)
左移<< 最左侧位不要了 最右侧补0
无符号右移>>> 最右侧位不要了,最左侧补0
public class Text {
public static void main(String[] args) {
int a = 0xff0 ; //十六进制数字
System.out.printf("%x\n",a >> 1); //用printf格式化输出内容,%x表示按照十六进制输出,方便观察
System.out.printf("%x\n",a << 1);
System.out.printf("%x\n",a >>> 1);
}
}
最终结果如下
6.条件运算符
条件运算符只有一个(表达式1 ?表达式2 : 表达式3)
条件运算符也是Java中唯一的一个三目运算符,是条件判断语句的简化写法,当表达式1的值为true时,整个表达式为表达式2的值;当表达式1的值为false时,整个表达式为表达式2的值.
求三个整数的最大值和最小值
public class Text {
public static void main(String[] args) {
int a = 3 ;
int b = 4 ;
int c = 5 ;
int max = (a > b ? a : b) > c ? (a > b ? a : b ): c;
int min = (a > b ? b : a) > c ? c : (a > b ? b : a);
System.out.println("最大值为" + max + "\t最小值为" + min);
}
}
最终结果如下