运算符与表达式:Java世界的“计算器”
各位同学,欢迎来到第一章。今天咱们聊聊Java里的运算符和表达式。
说白了,运算符就是Java世界里的“计算器”。你给它数据,它给你结果。我刚开始学Java时,觉得这玩意儿太简单了,不就是加减乘除吗?后来才发现,这里面的门道还真不少。
1. 算术运算符:最基础的数学工具
算术运算符,就是咱们小学就学过的加减乘除。但在Java里,它们有自己的一套规矩。
int a = 10;
int b = 3;
int sum = a + b; // 13
int diff = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3(注意!不是3.333)
int remainder = a % b; // 1
嗯,这里要注意:整数相除,结果还是整数。10除以3,结果是3,不是3.333。为什么?因为Java把小数部分直接砍掉了。我当年写第一个计算器程序时,就被这个坑过——用户输入10和3,我期待输出3.33,结果给我来了个3。
还有两个特殊的运算符:++和--。它们叫自增和自减。
int x = 5;
int y = x++; // y = 5, x = 6(先赋值,后自增)
int z = ++x; // z = 7, x = 7(先自增,后赋值)
我个人习惯:在循环里用i++,在复杂表达式里尽量不用自增自减。你想想看,代码是写给人看的,不是写给机器看的。一行代码里塞三个++,过两天你自己都看不懂。
2. 赋值运算符:给变量“喂”数据
赋值运算符,最基础的就是=。但Java还提供了一些“快捷方式”。
| 运算符 | 示例 | 等价于 |
|---|---|---|
| = | a = 5 | a = 5 |
| += | a += 3 | a = a + 3 |
| -= | a -= 2 | a = a - 2 |
| *= | a *= 4 | a = a * 4 |
| /= | a /= 2 | a = a / 2 |
| %= | a %= 3 | a = a % 3 |
我建议你多用这些复合赋值运算符。为什么?因为代码更简洁,而且编译器有时候能优化得更快。比如count += 1就比count = count + 1看着舒服多了。
3. 比较运算符:判断“谁大谁小”
比较运算符的结果只有两种:true或false。说白了,就是用来做判断的。
int age = 18;
boolean isAdult = age >= 18; // true
boolean canDrive = age > 16; // true
boolean isTeen = age < 20; // true
boolean isEqual = age == 18; // true(注意是两个等号!)
boolean notEqual = age != 20; // true
==,不是=!=是赋值。我见过太多新手在if条件里写if (a = 5),结果程序永远执行那个分支。嗯,编译器会报错,但如果你用boolean变量,它可能不会报错——那就更坑了。
4. 逻辑运算符:组合多个条件
逻辑运算符用来连接多个比较表达式。常用的有三个:&&(与)、||(或)、!(非)。
int score = 85;
boolean passed = score >= 60; // true
boolean excellent = score >= 90; // false
boolean canGetReward = passed && !excellent; // true(及格了但不是优秀,也能拿奖励)
int age = 20;
boolean hasID = true;
boolean canEnter = age >= 18 && hasID; // true(成年且有身份证)
这里有个小技巧:短路求值。什么意思?&&左边如果是false,右边就不执行了;||左边如果是true,右边也不执行了。
if (user != null && user.getName().equals("admin"))——如果user是null,右边根本不会执行,也就不会报空指针了。
5. 位运算符:直接操作二进制位
位运算符直接操作数据的二进制位。说实话,日常开发中用得不多,但在某些场景下非常高效。
int a = 5; // 二进制:0101
int b = 3; // 二进制:0011
int and = a & b; // 0001 = 1(按位与)
int or = a | b; // 0111 = 7(按位或)
int xor = a ^ b; // 0110 = 6(按位异或)
int not = ~a; // 1010 = -6(按位取反)
int leftShift = a << 1; // 1010 = 10(左移1位,相当于乘以2)
int rightShift = a >> 1; // 0010 = 2(右移1位,相当于除以2)
我记得有一次做性能优化,需要判断一个数是不是2的幂次方。用n & (n-1) == 0这个位运算技巧,比循环判断快了一个数量级。你想想看,位运算直接操作内存里的二进制位,速度当然快。
&和&&不一样,|和||也不一样。位运算符没有短路求值特性,而且操作的是二进制位,不是布尔值。
6. 三元运算符:简洁的条件判断
三元运算符是Java里唯一一个需要三个操作数的运算符。格式是:条件 ? 值1 : 值2。
int score = 75;
String result = score >= 60 ? "及格" : "不及格";
System.out.println(result); // 输出:及格
// 可以嵌套使用,但不建议
int a = 10, b = 20;
int max = a > b ? a : b; // 20
我个人习惯:三元运算符适合简单的二选一场景。如果逻辑复杂,还是老老实实写if-else吧。代码可读性比代码简洁更重要。
7. 运算符优先级:谁先谁后?
运算符优先级,说白了就是“先算谁后算谁”。和数学里的先乘除后加减一个道理。
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1(最高) | ()、[]、. | 从左到右 |
| 2 | ++、--、!、~ | 从右到左 |
| 3 | *、/、% | 从左到右 |
| 4 | +、- | 从左到右 |
| 5 | <<、>> | 从左到右 |
| 6 | <、<=、>、>= | 从左到右 |
| 7 | ==、!= | 从左到右 |
| 8 | & | 从左到右 |
| 9 | ^ | 从左到右 |
| 10 | | | 从左到右 |
| 11 | && | 从左到右 |
| 12 | || | 从左到右 |
| 13 | ?: | 从右到左 |
| 14(最低) | =、+=、-=、*=、/=、%= | 从右到左 |
()把你想先算的部分括起来。这样代码更清晰,别人一看就懂,你自己也不会搞错。
举个例子:
// 不清晰的写法
int result = a + b * c - d / e;
// 清晰的写法
int result = a + (b * c) - (d / e);
你想想看,哪种写法更不容易出错?肯定是第二种。代码是写给人看的,顺便给机器执行。别为了省几个括号,给自己和同事挖坑。
总结
好了,这一章的内容就到这里。运算符是Java编程的基础工具,就像厨师手里的刀——用得好,切菜如飞;用不好,容易伤到自己。
我建议你:
- 多动手写代码,光看不练假把式
- 遇到不确定的优先级,加括号
- 注意整数除法和短路求值这两个坑
- 位运算符先了解,用到时再深入
下一章咱们聊数据类型和类型转换。到时候见!
公众号:蓝海资料掘金营,微信deep3321