一、什么是运算符
运算符就是对操作数进行操作时的符号,不同运算符操作的含义不同
部分运算符在使用时会发生整形提升操作
二、算术运算符
算术运算符有三种:基本四则运算符、增量运算符和自增/自建运算符
1.基本四则运算符
基本四则运算的运算符包括五个:+ - * /(整除) %(取余或者取模)
(1)/的规则(注意事项)
【加小数点问题】int / int 结果还是int类型,而且会向下取整
如:
public static void main(String[] args) { int a = 3; int b = 2; // 在数学中应该是1.5 但是在Java中输出结果为1 会向下取整,即小数点之后全部舍弃掉了 System.out.println(a / b); // 如果要得到数学中的结果,可以使用如下方式 double d = a*1.0 / b; System.out.println(d); }
所以,当左右两边不是float时,需要加上.0或者*1.0
【操作数取值】
当做除法时,右边的操作符不能是0,否则编译器会报错误(算术错误),如:10/0,这是错误的。
(2)%的规则
(1)与/一样,右边的操作数不能是0,如:10%0
(2)% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的。也就是%的结果可以有小数和负数。
(3)四则运算符规则
都是二元运算符,使用时必须要有左右两个操作数。两侧操作数类型不一致时,向类型大的提升
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
注意:只有变量才能使用该运算符,常量不能使用
3.自增/自减运算符++/--
【符号特点】++是给变量的值+1,--是给变量的值-1。
【分类】分为前置/后置++/--,如:a++(后置++,使用完后++),++a(前置++,++完后再使用)
【使用】
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之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
- 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
三、关系运算符
六个关系运算符其计算结果是 true 或者 false 。
(1)==:相等符号,用来判断两个式子是否相等
(2)!=:不等于符号,用来判断是否不相等
(3)>:大于号,用来判断大小
(4)<:小于号,用来判断大小
(5)>=:大于等于号,
(6)<=:大于等于号
【使用】
int a = 10; int b = 20; // 注意:在Java中 = 表示赋值,要与数学中的含义区分 // 在Java中 == 表示相等 System.out.println(a == b); // false System.out.println(a != b); // true System.out.println(a < b); // true System.out.println(a > b); // false System.out.println(a <= b); // true System.out.println(a >= b); // false
四、逻辑运算符(重点)
逻辑运算符包括三个,&&、||、!,运算结果都是 boolean类型。
1.逻辑与&&
【语法规则】表达式1&&表达式2
注意:表达式1和表达式2都必须是boolean的结果,两边的结果都为true,整体才为true
【规则】
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 假 |
假 | 真 | 假 |
假 | 假 | 假 |
【使用举例】
public static void main(String[] args) { 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); // 左为假 且 右为假 则结果为假 }
结果:
【用处】常用于要求两个条件需要同时满足时,如果if语句中的条件等
【短路与】逻辑与也称为短路与
什么意思呢?就是当表达式1为假的时候,表达式2不会去执行(因为没有必要再去侦察它的真假,系统就会跳过表达式2)
如:下面的代码是不会报错的
int i=111; System.out.println(i > 222 && (10/0)==0);
结果:
10/0的表达式是错误的,但是因为第一个表达式是错的,发生了短路,就不会再去判断第二个表达式
2.逻辑或||
【语法规则】表达式1||表达式2
注意:表达式1和表达式2都必须是boolean的结果,两边有一个为true,整体的结果就为true。
【规则】
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
【使用举例】
public static void main(String[] args) { 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); // 左为假 且 右为假 则结果为假 }
结果:
【短路或】逻辑或也称为短路或
同样,当表达式1为真时,不会再去执行表达式2.
3.逻辑非
【语法规则】!表达式
注意:假边真,真变假。
【规则】
表达式 | 结果 |
真 | 假 |
假 | 真 |
【使用】
int a = 1; System.out.println(!(a == 1)); // a == 1 为true,取个非就是false System.out.println(!(a != 1)); // a != 1 为false,取个非就是true
【注意】
在C语言中,可能会用(!数值)表示条件,如:if(!a),在java中,这是不允许的
4.补充
& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值
五、位运算符
1.位运算符介绍
(1)位操作表示:按二进制位运算.,计算机中都是使用二进制来表示数据的(01构成的序列),按位运算就是在按照二进制位的每一位依次进行计算.
操作对象:二进制的补码
(2)位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。
2.按位与&
(1)&的特点:如果两个二进制位都是 1, 则结果为 1, 否则结果为 0
&的口诀:有0为0,全1为1。
(2)用法举例
public static void main(String[] args) { int a=10; int b=15; System.out.println(a&b); }
a&b的结果:10
运算过程:
3.按位或|
(1)|的特点:如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
|的口诀:有1为1,全0为0。简称同为0
(2)用法举例
public static void main(String[] args) { int c=10; int d=15; System.out.println(c|d); }
c|d的结果:15
按位与过程:
4.按位异或^
(1)^的特点:如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.
口诀:找不同,用1标记;相同为0,相异为1
性质:
(1)支持交换律
(2)相同异或为0:a^a=0
(3)任何数异或0等于本身:a^0=a
(2)用法举例:
public static void main(String[] args) { int a=10; int b=15; System.out.println(a^b); }
a^b的结果:5
异或的过程:
5.按位取反~
(1)如果该位为 0 则转为 1, 如果该位为 1 则转为 0,又称异或非
如:10的补码为00001010,则会转为11110101
(2)用法举例
public static void main(String[] args) { int a=10; System.out.println(~a); }
取反结果:-11
取反过程:
六、移位运算符(了解)
1.左移操作符<<
(1)特点:左边丢弃,右边补0
注意点:因为最左边丢弃的是符号位,因此正数左移有可能变成负数
(2)用法举例:
public static void main(String[] args) { int a=10; System.out.println(a); System.out.println(a<<1); System.out.println(a<<2); }
左移结果:
左移过程解析:
(3)注意事项
左移的长度需要是非负数
左移一次具有*2的效果
2.右移操作符>>
右移操作符有两种:符号右移和无符号右移
(1)符号右移>>
【语法特点】最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
【用法举例】
public static void main(String[] args) { int a=10; System.out.println(a>>1); System.out.println(a>>2); }
右移结果:
右移过程刨析:
【注意事项】
(1)右移的长度需要是非负数和整数
(1)右移一位具有/2的效果,两位具有/2^2的效果,但是-1例外,会得到本身
(2)无符号右移>>>(与C的写法不同)
【语法特点】最右侧位不要了, 最左侧补都补0
【语法举例】
public static void main(String[] args) { int a=10; System.out.println(a>>>1); int b=-10; System.out.println(b>>>1); }
无符号右移结果:5、2147483643(整形最大值)
解析:因为最左侧丢掉的是符号位,负数会变成正数;正数依旧是/2的效果
七、条件运算符
条件运算符也成为三目运算符,是Java中唯一一个三目运算符。
(1)语法特点:表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值。
【注意】
(1)表达式1的值必须是布尔表达式
(2)表达式1的值需要用变量来接收或者直接打印
(2)实例:求两个数的最大值
public static void main(String[] args) { int a = 520; int b = 1314; int max = a>b?a:b; System.out.println(max); }
表达式1:a>b,他们必须直接必须有一个结果
八、运算符的优先级及运算符总结
不同的符号存在优先级,但是符号很多,我们不需要记忆,只需要规范使用小括号就可以。
总结:与C语言的不同点
(1)基本四则运算符中的取模符%
在C中,%的结果只有正数;而在Java中,可以有小数和负数
(2)逻辑非!
在C中,!的左边可以是数字,或者表达式,如!1;在Java中,!的左边必须是布尔表达式,就是表达式的结果比赛true就是false
(3)|与&
Java中,& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算.。但是在C中没有这种说法
(4)无符号右移操作符>>>
无符号右移操作符其实就是右移操作符的一种操作规则。在C语言中,右移操作符都是>>,只是在不同的平台上有不同的右移方式(右移方式不能自己决定);而在Java中,把他们分离开来,成为了两个符号,右移的方式在操作者手中。