知识框架
运算符概述
运算符是指对操作数的运算方式。例如:1 + 2,其中1和2都是操作数, + 是操作符,操作符和操作数组成在一起就构成了表达式。运算符按照操作数的个数来分,可以分为单目运算符,双目运算符,三目运算符。运算符按照功能来分,分为算数运算符,赋值运算符,关系运算符,逻辑运算符,位运算符,条件运算符,字符串连接运算符等。常见的运算符如下表所示
算术运算符 | +,-,*,/,%,++,-- |
关系运算符 | >,>=, <,<=,==, != |
逻辑运算符 | &,|,!,&&,|| |
赋值运算符 | =,+=,-=,*=,/=,%=,^=,&=,|=,<<=,>>= |
位运算符 | &,|,^,~,<<,>>,>>> |
条件运算符 | 布尔表达式 ?表达式1:表达式2 |
字符串连接运算符 |
算术运算符
算术运算符包括:+,-,*,/,%,++,--。
请看如下代码:
public class ArithmeticOperatorTest1 {
public static void main(String[] args) {
int a = 5;
int b = 10;
System.out.println(a + b);//15
System.out.println(a - b); //-5
System.out.println(a * b); //50
/*
在数学运算中 5 / 10 = 0.5
在Java中 5 / 10 的结果不是0.5,在java中有一个语法规则:
int类型和int类型做运算,最终结果还是int类型,所以5 / 10
的结果就是0,这个过程会取整数部分。
*/
System.out.println(a / b); //0
// 求余数:
System.out.println(a % b); //5
/*
++和--都是单目运算符,++负责自加1,--负责自减
++无论是出现在变量前还是变量后,只要执行完++
最终的结果都会让变量自加1
*/
int i = 10;
i++;
System.out.println("i = " + i);//11
int j = 10;
++j;
System.out.println("j = " + j);//11
//在java语法规定,当++运算符出现在变量后(后置++),会先做赋值运算,再加1
//k = 11 l = 10
int k = 10;
int l = k++;
System.out.println("k = " + k);//11
System.out.println("l = " + l);
//java语法规定:++出现在变量前面(前置++)会先进行自加1,然后再进行赋值运算
//x = 11 y = 11
int x = 10;
int y = ++x;
System.out.println("x = " + x); //11
System.out.println("y = " + y); //11
//操作符两侧的操作数类型不一致时,向类型大的提升:
System.out.println(1 + 1.2); //2.2
}
}
通过上述代码可知:
1:两个int类型的数据进行数学运算之后所得的结果一定还是int类型。
2:操作符两侧的操作数类型不一致时,向类型大的提升。
2:++或者--可以出现在变量前,也可以出现在变量之后,只要执行了++,变量一定会自加1
只要执行了--,变量一定会自减1。
3:前置++变量先加1,再进行赋值运算;后置++,先进行赋值运算,变量在加1,前置--和后置--道理和前置++,后置++一样。
int c = 100; System.out.println(c++);//100 System.out.println(c); // 101 int d = 100; System.out.println(++d); //101 System.out.println(d);//101
注意:在进行/和%操作时,右操作数不能为0,否则就会抛异常。
看如下代码:
System.out.println(3/0); System.out.println(10%0);
关系运算符
关系运算符主要是完成数据和数据之间的比较。例如:1 > 2结果是false, 10 > 5结果是true,常见的关系运算符有 >, >=, <, <=, ==, !=。任何一个关系运算的运算结果都是布尔类型。
请看如下代码:
public class RelationOperatorTest01 {
public static void main(String[] args) {
int a = 5;
int b = 5;
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);//a变量里面存储的值和b变量里面存储的值进行比较
System.out.println(a != b);
}
}
运行结果:
逻辑运算符
逻辑运算符主要包括逻辑与(&),逻辑或(|),逻辑异或(^),短路与(&&),短路或(||)。逻辑运算符的特点就是操作数和最终的运算结果都是布尔值。逻辑运算规则如下表所以:
操作符 | 例子 | 结果 | 描述 |
---|---|---|---|
& | true&true | true | (3>2)&(2>1):3大于2并且2大于1 |
| | true|false | true | (10>8)| (3>5):10大于8或3大于5 |
! | !false | true | false取反是true,true取反是false |
^ | true^false | true | 异或,只要两边的操作数不同,就是true |
&& | true&&true | true | 最终结果和逻辑与一样,但是会发生短路 |
|| | true||false | true | 最终结果和逻辑或一样,但是会发生短路 |
请看如下代码:
public class ArithmeticOperatorTest3 {
public static void main(String[] args) {
System.out.println(5 > 3 & 6 > 5); //true
System.out.println(10 > 15 | 10 < 12);//true
System.out.println(!(3 > 2));//false
System.out.println(true & false);//false
System.out.println(true | false);//true
System.out.println(true ^ false);//true
System.out.println(!true);//false
}
}
逻辑与(&)和短路与(&&)的区别:请看如下代码:
public class LogicalOperatorTest1 {
public static void main(String[] args) {
int a = 200;
int b = 150;
int c = 180;
//逻辑与和短路与最终的运行结果一致:
System.out.println(a > b & a > c);
System.out.println(a > b && a > c);
/*
逻辑与运算符只有当两边的操作数都是true的时候,结果才是true,只要有一个是false,
结果必然是false.逻辑与运算符无论左边表达式结果是true还是false,右边表达式一定会执行。
*/
int m = 99;
int n = 100;
System.out.println(m > n & m>n++);
System.out.println(n); //101说明右边表达式被执行
int x = 99;
int y = 100;
System.out.println(x > y && x> y++);
System.out.println(y); //100,说明右边表达式没有被执行
}
}
结论:逻辑与右边的表达式一定会被执行,短路与当左边表达式为false的时候,右边表达式不会被执行(短路现象),这种机制更加智能化,效率更高一些,(逻辑或 与 短路或同理)。
赋值运算符
常见的赋值运算符有:=, +=,-=,*=,/=, %= 。
public class AssignmentOperatorTest {
public static void main(String[] args) {
//基本的赋值运算符:
int a = 10;
System.out.println("a = " + a);//10
//扩展的赋值运算符:
int b = 100;
b += 10;
System.out.println("b = " + b);//110
int x = 10;
x -= 10;
System.out.println("x = " + x);//0
int y = 20;
y *= 2;
System.out.println("y = " + y);//40
int z = 100;
z /= 10;
System.out.println("z = " + z);//10
int m = 6;
m %= 3;
System.out.println("m = " + m);//0
}
}
注意:基本的赋值运算符和扩展的赋值运算符不一样:如x+=1 和x = x + 1
请看如下代码:
public class AssignmentOperatorTest1 {
public static void main(String[] args) {
byte x = 1;
x+=1;
System.out.println(x);//2
x = x + 1;//编译不通过
/*
x = x + 1;//编译不通过编译不通过的原因:x是属于byte类型,而1是属于int类型,按照类型转换
规则,int和byte进行混合运算时,最终的结果是属于int 类型,而int类型无法赋值给byte类型的变 量
*/
}
}
byte x = 1; x+=1; System.out.println(x);//2 这句话可以正确运行的原因:
java对于扩展类型的赋值运算符进行了特殊处理,所有的扩展赋值运算符
最终都不会改变运算的结果类型,比如前面的变量byte类型,
那么 x+=1这种写法就等同于 x = (byte)(x + 1)。在使用扩展类赋值运算符的时候要谨慎,可能会发生精度丢失。
条件运算符
条件运算符属于三目运算符,它的语法格式如下:
布尔表达式 ? 表达式1:表达式2
条件运算符运行的原理:先判断布尔表达式,如果结果是true则执行表达式1,否则执行表达式2
public class ConditionalOperatorTest {
public static void main(String[] args) {
int x = 10;
int y = 10;
System.out.println(x == y ? "x和y相等" : "x和y不相等");
}
}
字符串连接运算符
"+"运算符在java当中有两个作用,第一个作用是对数字进行求和运算;第二个作用是字符串连接运算。如果"+''两边的操作数都是数字的话,一定是求和运算,但只要其中一个操作数是字符串,那就一定是字符串拼接运算,字符串拼接之后的结果还是字符串类型。当一个表达式当中有多个"+",并且在没有小括号的前提之下遵循自左向右的顺序依次执行。
看如下代码:
public class PlusTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a + b);//30
System.out.println("a + b = " + a + b);//a + b = 1020
System.out.println("a + b =" + " " + (a + b) );//a + b = 30
System.out.println("欢迎" + "name" + "回家!");
}
}