运算符
1.什么是运算符
计算机的最基本用途之一就是执行数学运算,比如:
int a = 10;
int b = 20;
a + b;
a < b;
上述的+和<就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。
作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符(+ - */)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。
2.算数运算符
2.1基本四则运算符:加减乘除模(+ - * / %)
int a = 20;
int b = 10;
System.out.println(a + b); //30
System.out.println(a - b); //10
System.out.println(a * b); //200
System.out.println(a / b); //2
System.out.println(a % b); //0(模运算相当于数学中除法的余数)
注意:
1.都是二元运算符,使时必须要有左右两个操作数
2.int/int结果还是int类型,而且会向下取整
3.做除法和取模时,右操作数不能为零
4.%不仅可以对整型取模,也可以对double类型取模,但没有意义,一般都是对整型取模的
5.两侧操作类型不一致时,向类型大的提升
2.2增量运算符(+=,-=,*=,/=,%=)
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
int a = 1;
a+=2; //相当于a=a+2
System.out.println(a); //输出3
a-=1; //相当于a=a-1
System.out.println(a); //输出2
a*=3; //相当于a=a*3
System.out.println(a); //输出6
a/=3; //相当于a=a/3
System.out.println(a); //输出2
a%=3; //a=a%2
System.out.println(a); //输出2
注意:只有变量才能使用运算符,常量不能使用。
2.3自增/自减运算符(++,- -)
++是给变量的值+1,- -是给变量的值-1。
int a = 1;
a++; //后置++,表示给a的值+1,此时a的值为2
System.out.println(a++); //注意:后置++是先使用变量原来的值,表示式结束时给变量+1,因此输出2
System.out.println(a); //输出3
++a; //前置++,表示给a的值+1
System.out.println(++a); //注意:前置++是先给变量的值+1,然后使用变量中的值,因此输出5
System.out.println(a); //输出5
注意:
如果单独使用,【前置++】和【后置++】没有任何区别
如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
3.关系运算符(==,!=,<,>,<=,>=)
其计算结果是ture或false
int a = 10;
int b = 20;
//注意:在Java中=表示赋值
//在Java中==表示相等
System.out.println(a == b); //false
System.out.println(a != b); //ture
System.out.println(a < b); //ture
System.out.println(a > b); //false
System.out.println(a <= b); //ture
System.out.println(a >= b); //false
注意:当需要多次判断时不能连着写。比如:3<a<5,java的程序与数学是有区别的
4.逻辑运算符(&&,||,!)
运算结果都是boolean类型
4.1逻辑与&&
语法规则:表达式1&&表达式2,左右表达式必须是boolean类型的结果。相当于且。
同真则真,一假则假
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); //左假且右假,结果为假
4.2逻辑或||
语法规则:表达式1||表式2,左右表达式必须是boolean类型的结果。相当于或。
一真则真
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); //左假但右假,结果为假
4.3逻辑非!
语法规则:!表达式
真变假,假变真
int a = 1;
System.out.println(!(a == 1)); //a == 1为ture,取非为false
System.out.println(!(a != 1)); //a != 1为false,取非就是ture
4.4短路求值
==&&和||遵循短路求值规则==
System.out.println(10 > 20 && 10/0 == 0); //打印false
System.out.println(10 < 20 || 10/0 == 0); //打印true
我们都知道, 计算10/0会导致程序抛出异常. 但是上面的代码却能正常运行,== 说明10/0并没有真正被求值==.
注意:
对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.
对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式.
& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.
System.out.println(10 > 20 & 10/0 == 0); //程序抛出错误
System.out.println(10 < 20 | 10/0 == 0); //程序抛出错误
5.位运算符
位运算符主要有四个:& |^,除是一元运算符外,其余都是二元运算符。位操作表示按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.
5.1按位与&
如果两个二进制位都是1,则结果为1,否则结果为0.
int a = 10;
int b = 20;
System.out.println(a & b); //结果为0
进行按位运算,需要先把10和20转成二进制,分别为1010和10100
5.2按位或 |
如果两个二进制位都是0,则结果位0,否则结果位1.
int a = 10;
int b = 20;
System.out.println(a | b); //结果为30
运算方式和按位与类似
5.3按位取反 ~
如果该位为0,则转为1,如果该位位1,则转为0.
int a = 0xf;
System.out.printf("%x\n",~a);
注意:
1.0x 前缀的数字为十六进制数字.十六进制可以看成是二进制的简化表示方式.一个十六进制数字对应 4个二进制位.
2.0xf 表示 10 进制的 15, 也就是二进制的 1111
3.printf 能够格式化输出内容, %x 表示按照十六进制输出.
4.\n 表示换行符
5.4按位异或 ^
如果两个数字的二进制位相同,则结果位0,相异则结果为1.
int a = 0x1;
int b = 0x2;
System.out.printf("%x\n",a^b);
6.位移运算(简单了解)
6.1左移 <<:
最左侧位不要了,左右侧补0
6.2右移 >>:
最右侧位不要了,最左侧补符号位(正数补0,负数补1)
6.3无符号右移 >>>:
最右侧位不要了,最左侧补0
7.条件运算符
表达式1?表达式2:表达式3
Java中唯一的三目运算符
当表达式1的值为 true 时, 整个表达式的值为表达式2的值;
当表达式1的值为 false 时, 整个表达式的值为表达式3的值.
注意:
- 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换.
- 表达式不能单独存在,其产生的结果必须要被使用。