运算符与表达式: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。

避坑指南:我曾经在写一个财务系统时,用整数除法计算单价,结果所有订单金额都少了几毛钱。后来排查了半天,才发现是整数除法惹的祸。记住:需要小数结果,就用double或float。

还有两个特殊的运算符:++--。它们叫自增和自减。

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. 比较运算符:判断“谁大谁小”

比较运算符的结果只有两种:truefalse。说白了,就是用来做判断的。

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