计算机的基本用途就是执行数学运算,Java提供了一套丰富的运算符来操作变量。
算数运算符
- +,-,*,/,%属于二元运算符,%属于取模运算符。
- 自增运算符++,自减运算符--属于一元运算符
二元运算符的运算规则:
整数运算:
- 如果两个操作数有一个为long,则结果也是long类型;
- 没有long类型时,结果为int。即使操作数全部都为short,byte,结果也是int;
浮点运算:
- 如果两个操作数有一个是double,则结果为double。
- 只有两个操作数都是float,结果都为float;
取模运算:
- 其操作数可以是浮点数,一般使用整数,结果是‘余数’,‘余数’符号和左边操作数一致,如:7%3=1;-7%3=-1;7%-3=1;
public class TestOperator01 {
public static void main(String[] args) {
int a = 3;
int b = 4;
// long b = 4;
int c = a + b; // 假如b是long类型,a + b属于long类型,则int c 会报错:不兼容的类型,long不可以赋值给int类型
System.out.println(c);
double d = 3 + 3.14;
int d2 = 32/3; // 10, int类型则直接保留整数部分,直接去除小数部分,没有四舍五入;
System.out.println(d2);
double d3 = 32.0/3;
System.out.println(d3);// 10.66666666
// 取余数
int e = 10 % 3; // 1, 取余操作。结果符号和左边操作数相同
System.out.println(e);
// 测试自增自减
int g = 30;
g++; // 相当于 g = g + 1;
g--; // 相当于 g = g - 1;
g = 10;
int h = g++; // 先赋值,后自增
g = 10;
int i = ++g; // ++g先自增,后赋值
System.out.println(h); // 10;
System.out.println(i); // 11
}
}
赋值及其扩展赋值运算符
public class TestOperator2 {
public static void main (String[] args) {
int a = 3;
int b = 4;
a += b; // 相当于 a = a + b;
System.out.println(a); // 7
a = 3;
a *= b + 3; // 相当于 a = a*(b+3)
System.out.println(a); // 21
}
}
关系运算符
关系运算符用来进行比较运算,关系运算符的结果是布尔值 true/false;
- = 是赋值运算符,而真正的判断两个操作数是否相等的运算符是==;
- ==、!= 是所有(基本和引用)数据类型都可以使用
-
、>=、<、<= 仅针对数值类型(byte/short/int/long, float/double)以及char
public class TestOperator3 {
public static void main(String[] args) {
int a = 3;
int b = 4;
boolean c = a > b;
System.out.println(c);
char d = 'h';
// char 值位于0~65536之间,可以通过int强制转型为数字
System.out.println((int)d);
boolean e = d > 100;
System.out.println(e);
}
}
逻辑运算符
逻辑运算的操作数和结果都是boolean值
其中短路与 和 与 的不同点在于:
与:对于左右条件都会去执行; 短路与:左侧条件如果为false了,则不再执行右侧条件
public class TestOperator4 {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = false;
System.out.println(b1 & b2); // false
System.out.println(b1 | b2); // true
System.out.println(!b1); // false
System.out.println(b1 ^ b2); // true
// 短路与、短路或
boolean b3 = 1 > 2 && (4 < 3/0);
System.out.println(b3); // false; 1 > 2 得到false的情况下,不再执行计算(4 < 3/0),即使0不能作为分母
boolean b4 = 1 < 2 && 3 < 2;
System.err.println(b4); // false, 1 < 2为 true,则也会继续执行后面的 3 < 2,为false;
boolean b5 = 1 > 2 & (4 < 3/0);
System.out.println(b5); // 报错,& 左右两侧都会执行
}
}
位运算
位运算指的是二进制位的运算
注意:& 和 | 既是逻辑运算符,又是位运算符。如果左右两侧是boolean类型,则作为逻辑运算符,如果左右两侧是整数类型,则是位运算;
public class TestOperator5 {
public static void main (String[] args) {
int a = 7;
int b = 8;
System.out.println(a & b); //0, 7 的二进制是 0111, 8的二进制1000 最终得到 0000;
System.out.println(a | b); // 15; 7 的二进制是 0111, 8的二进制1000 最终得到 1111, 则是15
System.out.println(a ^ b); // 15; 7 的二进制是 0111, 8的二进制1000;相同为0,不同为1,则也是1111,表示15
System.out.println(~b); // -9;
// 移位
int c = 5 << 1;// 左移运算符,左移一位相当于乘以2;5 * 2
System.out.println(c); // 10;
int e = 5 << 2; // 5*2*2;
System.out.println(e); // 20;
int f = 40 >> 3;
System.out.println(f); // 40/8 = 5
}
}
字符串连接符
+左右两侧的操作数只要有一个是字符串类型,系统会自动将另一个操作数转换为字符串再进行连接。
public class TestOperator6 {
public static void main(String[] args) {
String a = "3";
int b = 4;
System.out.println(a+b); // "34"
// 条件是String字符串,不是char.若是char,则仍然是加法;
char c1 = 'h';
char c2 = 'i';
System.out.println(c1+c2); // 209, 这时候还是加法运算
// 通过加空字符串,让+都变成连接符
System.out.println("" + c1 + c2); // "hi"
}
}
条件运算符
public class TestOperator6 {
public static void main(String[] args) {
int score = 60;
String type = score < 60 ? "不及格" : "及格";
System.out.println(type); // 及格
}
}
运算符优先级
- 无需刻意记这些优先级,表达式里面优先用()来组织;
- 逻辑与、逻辑或、逻辑非得优先级:逻辑非 > 逻辑与 > 逻辑或;
public class TestOperator6 {
public static void main(String[] args) {
boolean s1 = true, s2 = true, s3 = false;
System.out.println(s1 || s2 && s3); // true; 非 > 与 > 或; s1 || (s2 && s3)
}
}