目录
一、算术运算符
二、复合赋值运算符
三、自增、自减运算符
四、关系运算符
五、逻辑运算符
六、位运算符
七、移位运算符
八、条件运算符
九、运算符的优先级
十、Java中的注释
十二、Java中的关键字
十三、总结
一、算术运算符
- ? +(加)? -(减)? *(乘)? /(除)? %(取模)
👀 +(加)-(减)*(乘)与数学中的类似,这里就不过多的叙述了。
1、/ (除法): 得到的是商
- 🍓当? /(除号)两端都是整数时,执行的是整数除法,整数除法得到的结果是整数部分,小数部分直接舍去。
- 🍓两端只要有一个浮点数,执行的就是浮点数的除法。
public class TestDemo {
public static void main(String[] args) {
System.out.println(1 / 2);
System.out.println(1.0/2);
}
}
运行结果
🍓0不能做除数
2、% (取模): 得到的是相除之后的余数
🍓 Java中不仅可以对 int 取模, 也能对 double 来取模。
public class TestDemo {
public static void main(String[] args) {
System.out.println(-10%3);
System.out.println(10%-3);
System.out.println(-10%-3);
System.out.println(13.5%3);
}
}
运行结果
二、复合赋值运算符
- ? +=:加等? ? -=:减等? ? *= :乘等 ? /=:除等 ? %=:取模等
🍉 这几个运算符与C语言中的复合运算符使用一样,但需要注意:
public class TestDemo {
public static void main(String[] args) {
int a = 10;
a+=1; //a = a + 1;
System.out.println(a);
}
}
运行结果
💥 下面这段代码是将int类型的数据与short类型的数据相加,将结果赋给short类型,所以会报错。
🎄 使用复合运算符就不会报错,使用复合运算符会自动进行强制类型转换。
public class TestDemo {
public static void main(String[] args) {
short a = 20;
a+=1; //a = a + 1;
System.out.println(a);
}
}
运行结果
三、自增、自减运算符
🍉 ++、-- 运算符与C语言中的复合运算符使用一样。
💎 前置++:先++,后使用
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int i1 = ++a; // a = a+1; i1 = a;
System.out.println(a);
System.out.println(i1);
}
}
运行结果
💎 后置++:先使用,后++
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int i1 = a++; // i1 = a; a = a+1;
System.out.println(a);
System.out.println(i1);
}
}
运行结果
💎 前置--:先--,后使用
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int i1 = --a; //a = a-1; i1 = a;
System.out.println(a);
System.out.println(i1);
}
}
运行结果
💎 后置--:先使用,再--
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int i1 = a--; // i1 = a; a = a-1;
System.out.println(a);
System.out.println(i1);
}
}
运行结果
? 结论:
- 如果不取自增运算的表达式的返回值, 则前置自增和后置自增没有区别.
- 如果取表达式的返回值, 则前置自增的返回值是自增之后的值, 后置自增的返回值是自增之前的值。
四、关系运算符
- ? >:大于???????????? ? <:小于???????????? ? ==:等于
- ? >=:大于等于 ?? ? <=:小于等于??? ? !=:不等于 ??????
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
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 类型,结果不是 true 就是 false。
五、逻辑运算符
- ? &&:逻辑与 ?????? ? ||:逻辑或?????????!:逻辑非
🌊 &&(逻辑与):
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b > c); //false
}
}
? 结论:?
- 表达式 1 && 表达式 2 :两个表达式都是布尔表达式。
- 短路:如果表达式 1为假就不执行表达式 2。
- 两个表达式全为真,整个表达式才为真(true)。
🌊 ||(逻辑或):
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b > c); //true
}
}
运行结果
? 结论:??
- 表达式 1 || 表达式 2 :两个表达式都是布尔表达式。
- 短路:如果表达式 1为真就不执行表达式 2。
- 只要有一个表达式为真,整个表达式就为真(true)。
🌊 !(逻辑非):
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(!(a < b)); //false
System.out.println(!!(a < b)); //true
// System.out.println(!a < b); //error 逻辑操作符的表达式必须是布尔表达式
}
}
运行结果
? 结论:???
- !布尔表达式
- !false = true
- ! true = false
🍓 短路求值
public class TestDemo {
public static void main(String[] args) {
// 10>20 为假,所以不会执行&&后面的表达式
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
//10<20 为真,所以不会执行 || 后面的表达式
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
}
}
💥 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值.
? 结论:???
- 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式
- 对于 || , 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式.
🌀 & 和 | (不推荐使用)
- & 和 | 如果操作数为 boolean 的时候, 也表示逻辑运算. 但是和 && 以及 || 相比, 它们不支持短路求值.
六、位运算符
🍓 Java 中对数据的操作的最小单位不是字节, 而是二进制位.
- ? &:按位与 ? |:按位或 ? ^:按位异或 ? ~:按位取反
🌊 位操作表示按二进制位运算。计算机中都是使用二进制来表示数据的(0、1构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算。
1、按(2进制)位与:&
? 规则:两个二进制数,有0则为0,全1则为1。
public class TestDemo {
public static void main(String[] args) {
int a = 3;
int b = 5;
int c = a & b;
System.out.println(c);
}
}
运行结果
2、按(2进制)位或:|
? 规则:两个二进制数,有1则为1,全0则为0。
public class TestDemo {
public static void main(String[] args) {
int a = 3;
int b = 5;
int c = a | b;
System.out.println(c);
}
}
运行结果
💥 注意:
- 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算。
3、按(2进制)位异或:^
? 规则:两个二进制数,相同为0,相异为1。
public class TestDemo {
public static void main(String[] args) {
int a = 3;
int b = 5;
int c = a ^ b;
System.out.println(c);
}
}
?运行结果
?4、~ 按(二进制)位取反
? 规则:该位为 0 则变为 1, 该位为 1 则变为 0。
public class TestDemo {
public static void main(String[] args) {
int a = 0xf;
System.out.printf("%x\n", ~a);
}
}
运行结果
💥 注意:
- 0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位.
- 0xf 表示 10 进制的 15, 也就是二进制的 1111
- printf 能够格式化输出内容, %x 表示按照十六进制输出.
- \n 表示换行符
七、移位运算符
- ? <<:左移 ? >>:右移 ? >>>:无符号右移
🍓 左移 <<: 最左侧位不要了, 最右侧补 0
public class TestDemo {
public static void main(String[] args) {
int a = 3;
System.out.println(a<<1); //左移1位
}
}
🍓 右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
public class TestDemo {
public static void main(String[] args) {
int a = 3;
System.out.println(a>>1); //右移1位
}
}
🍓 无符号右移 >>>: 最右侧位不要了, 最左侧补 0。
public class TestDemo {
public static void main(String[] args) {
int a = -3;
System.out.println(a>>>1); //右移1位
}
}
运行结果
💥 注意:
- 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
- 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
- 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替。
- 移动负数位或者移位位数过大都没有意义。
- 没有无符号左移
八、条件运算符
🍓 表达式1 ? 表达式2 : 表达式3
- 表达式1是一个布尔表达式。当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值。
? Java 中唯一的一个三目运算符, 是条件判断语句的简化写法.
public class TestDemo {
public static void main(String[] args) {
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);
}
}
?九、运算符的优先级
🍉 Java中的运算符优先级与C语言一样,这里就不详细说明了。
优先级 | 运算符 | 类 | 结合性 | 1 | () | 括号运算符 | 从左到右 | 2 | !、+(正号)、-(负号) | 一元运算符 | 从左到右 | 3 | ~ | 位逻辑运算符 | 从右到左 | 4 | ++、-- | 自增自减运算符 | 从右到左 | 5 | *、/、% | 算术运算符 | 从左到右 | 6 | +、- | 算术运算符 | 从左到右 | 7 | <<、>>、>>> | 移位运算符 | 从左到右 | 8 | >、>=、<、<= | 关系运算符 | 从左到右 | 9 | ==、!= | 关系运算符 | 从左到右 | 10 | & | 位运算符、逻辑运算符 | 从左到右 | 11 | ^ | 位运算符、逻辑运算符 | 从左到右 | 12 | | | 位运算符、逻辑运算符 | 从左到右 | 13 | && | 逻辑运算符 | 从左到右 | 14 | || | 逻辑运算符 | 从左到右 | 15 | ?: | 条件运算符 | 从右到左 | 16 | =、+=、-=、*=、/=、%= | 关系运算符 | 从右到左 |
? 运算符之间是有优先级的, 具体的规则我们不必记忆,在可能存在歧义的代码中加上括号即可。
🎄 总结
- % 操作再 Java 中也能针对 double 来计算.
- 需要区分清楚前置自增 和 后置自增之间的区别.
- 由于 Java 是强类型语言, 因此对于类型检查较严格, 因此像 && 之类的运算操作数必须是 boolean.
- 要区分清楚 & 和 | 什么时候是表示按位运算, 什么时候表示逻辑运算.
?十、Java中的注释
- 注释是为了让代码更容易被读懂而附加的描述信息. 不参与编译运行, 但是却非常重要.
- 时刻牢记! 代码写出来是为了给人看的, 更是为了给三个月后的你自己看的.
🍓 基本规则
- 单行注释:// 注释内容(用的最多)
- 多行注释:/* 注释内容*/(不推荐)
- 文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可用来自动生成文档
🍓 注释规范
- 内容准确: 注释内容要和代码一致, 匹配, 并在代码修改时及时更新.
- 篇幅合理: 注释既不应该太精简, 也不应该长篇大论.
- 使用中文: 一般中国公司都要求使用中文写注释, 外企另当别论.
- 积极向上: 注释中不要包含负能量。
十二、Java中的关键字
十三、总结
详细介绍了Java中的运算符及使用方式,整体来看, Java 的运算符的基本规则和 C 语言基本一致!文章最后补充了Java中的注释与关键字。
|