- 前言
- 一、什么是运算符
- 二、算术运算符
- 1. 基本四则运算符
- 2. 增量运算符
- 3. 自增/自减运算符
- 3. 关系运算符
- 4. 逻辑运算符(重点)
- 1. 逻辑与&&
- 2. 逻辑或
- 3. 逻辑非 !
- 注意:
- 5. 位运算符
- 1. 按位与&
- 2. 按位或|
- 3. 按位取反~
- 4. 按位异或^
- 6. 移位运算(了解)
- 1. 左移 <<
- 2. 右移 >>
- 3. 无符号右移 >>>
- 4. 小结
- 7. 条件运算符
- 8. 运算符的优先级
- THINK
前言
欢迎一起进入运算符的世界!一起进步!
本节主要了解java的相关的运算符。
一起学习 一起进步!
努力踏平荆棘!
- *** 作符对 *** 作数进行 *** 作时的符号,不同运算符 *** 作的含义不同。
- 作为一门计算机语言,Java也提供了一套丰富的运算符来 *** 纵变量。Java中运算符可分为以下:算术运算符(+ - *
/)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。 - 表达式:运算符和 *** 作数结合
- 基本四则运算符:+ - * / %(模:求余)
- 两个整数相除,结果一定是一个整数,没有小数(强转另看)
public class TestDemo {
public static void main(String[] args) {
System.out.println(5/2);
System.out.println((float) 5/2);
System.out.println(5/(float)2);
System.out.println((float) (5/2));
}
}
分析:
public class TestDemo {
public static void main(String[] args) {
System.out.println(5/2);
//整型/整型=整型(向下取整)
System.out.println((float) 5/2);
//5强制转换float类型,则int会提升为float类型,结果为float类型
System.out.println(5/(float)2);
//2强制转换float类型,则int会提升为float类型,结果为float类型
System.out.println((float) (5/2));
//(5/2)是整型相除,结果为整型,然后该整型被强制转换为float类型
}
}
结果:
- 除数为0:
1)整型/0 : ArithmeticException–算术异常
异常:指的是这个程序运行的时候出现的不正常行为。
public static void main(String[] args) {
System.out.println(5/0);
}
结果:
2) 整型/ 浮点数0:
public static void main(String[] args) {
float a =0;
System.out.println(1/a);
}
结果:
分析:
浮点型是近似值,不是精确数,则a并不是一个实际的确定值0,是一个无限接近0的小数,故不报错且无穷大
- 求余数%(模)
1) 整数求模
public static void main(String[] args) {
System.out.println(10%3);
System.out.println(10%-3);
System.out.println(-10%3);
System.out.println(-10%-3);
}
分析:
看被除数,余数符号和被除数保持一致
结果:
2)小数求模
public static void main(String[] args) {
System.out.println(11.5%2.0);
}
注意:
可以对小数进行求余数
结果:
- 注意:
注意:
- 基本四则运算都是二元运算符,使用时必须要有左右两个 *** 作数
- int / int 结果还是int类型,而且会向下取整
- 补充
2. 增量运算符
- 做除法和取模时,右 *** 作数不能为0
- % 不仅可以对整形取模,也可以对double类型取模,但是没有意义,一般都是对整形取模的
- 两侧 *** 作数类型不一致时,向类型大的提升
- 增量运算符:+= -= *= %=
public static void main(String[] args) {
short s1 = 10;
short b = s1 +1;
}
分析:
1是int型,且记性运算时,会将小于int型的数据转换到int型计算,结果为int型,需要进行强转才可以得到short型
结果:
- +=自动进行类型转换
public static void main(String[] args) {
short s1 = 10;
short b =(short) (s1 +1);
b += 1;
System.out.println(b);
}
- 以上两种均可实现:强转 or +=
- 注意:只有变量才能使用该运算符,常量不能使用。
- 自增/自减运算符 ++ –
- 前置++与后置++:
对于自身而言,值最后都会变
但是对于赋值而言,前置后置会有区别 - 前置:先加后用–本身及被赋值的都变
后置:先用后加–本身变。被赋值的变量先不变
public static void main(String[] args) {
int a = 1;
int b = 1;
int c = ++a;
int d = b++;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
输出结果:
- 注意:
3. 关系运算符注意:
如果单独使用,【前置++】和【后置++】没有任何区别
如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
- 关系运算符主要有六个:== != > < >= <=
- 所有关系运算符与 *** 作数结合只有两个结果:true or
false - 注意:当需要多次判断时,不能连着写。比如:3 < a < 5,Java程序与数学中是有区别的,此时应该写为:(a > 3) && (a <5)
逻辑运算符主要有三个: && || ! ,运算结果都是 boolean类型,即运算结果只有 true or false。
1. 逻辑与&&- 布尔表达式均为真结果才是真
- 语法表达式:布尔表达式1 && 布尔表达式2 (布尔表达式:boolean类型表达式)
- 短路与:只要出现假就停止往后执行!!
public static void main(String[] args) {
int a =1;
int b =2;
System.out.println((a > b) && (19 /0 == 0));
}
结果:
2. 逻辑或分析:
理论上:19/0会报错,但是此时能得到正确结果,因为逻辑与是短路与,一旦遇到false就停止后面的计算
- 语法规则:布尔表达式1 || 布尔表达式2
- 只要一个表达式为真,结果即为真
- 短路或:只要出现一个表达式为真,后面的表达式就不被执行
public static void main(String[] args) {
int a =1;
int b =2;
System.out.println((a < b) || (19 /0 == 0));
}
结果:
3. 逻辑非 !分析:
理论上:19/0会报错,但是此时能得到正确结果,因为逻辑或是短路或,一旦遇到true就停止后面的计算
- 语法规则:!布尔表达式(注意:一定是布尔表达式!!)
- & 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.
public static void main(String[] args) {
System.out.println(10 > 20 & 10 / 0 == 0);
System.out.println(10 < 20 | 10 / 0 == 0);
}
5. 位运算符结果:抛出异常
- Java 中数据存储的最小单位是字节,而数据 *** 作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
- 位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。
- 位 *** 作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.
先转换为二进制,然后两个数对应位都是1,结果才是1
2. 按位或|先转换为二进制,然后两个数只要对应位存在1,结果就是1
3. 按位取反~0变为1,1变为0
注意:
- 0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4个二进制位.
0xf 表示 10 进制的 15, 也就是二进制的 1111 - printf 能够格式化输出内容, %x 表示按照十六进制输出.
- \n 表示换行符
- 对应位相同为0,相异为1
- 注意:如果两个数相同,则异或的结果为0
移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。
1. 左移 <<- 规则: 最左侧位不要了, 最右侧补 0.
- 对于正数而言,左移 *** 作就相当于乘以2 *** 作,每左移一位就会乘以一次2;则:左移n位就是(原数*2^n )
- 注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数 – 针对二进制
- 规则:最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
- 注意:前面补的位根符号位保持一致
- 对于正数而言:右移相当于除法,右移n位,则结果为:(原数/(2^n))
- 规则: 最右侧位不要了, 最左侧补 0.
- 不管符号位是0还是1,统统补0
则:负数进行无符号右移后会变正数
3, 无符号左移—没有!!
- 左移 1 位, 相当于原数字 * 2 ; 左移 N 位, 相当于原数字 * 2 的N次方.
- 右移 1 位, 相当于原数字 / 2.; 右移 N 位, 相当于原数字 / 2 的N次方.
- 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
- 移动负数位或者移位位数过大都没有意义.
- 即:三目运算符
- 条件运算符只有一个:表达式1 ? 表达式2 : 表达式3;
1为布尔表达式:若1为真,则执行2,否则执行3 - Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法
- 注意!!!
1)表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0;
}
结果:
2)若未赋值给变量直接输出,则可以表达式2、3 不同类型
public static void main(String[] args) {
System.out.println(true?1:2.0);
}
结果:(注意:被进行了类型的隐式转换)
3) 表达式不能单独存在,其产生的结果必须要被使用
public static void main(String[] args) {
int a = 10;
int b = 20;
a > b ? a : b;
}
结果:
不知道运算符优先级,则加括号即可
THINK
- 无符号右移>>>
- && || 逻辑 *** 作符–短路性质
- % 求模运算–多了小数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)