2.Java运算符与流程控制

Java 运算符与流程控制
有了变量,接下来就要判断条件,再决定执行哪段代码。我们先看逻辑和位运算,然后用分支、循环控制程序怎么往下走。
| 写法 | 意思 | 例子 |
|---|---|---|
+ - * / % |
加、减、乘、除、求余数 | 5 % 2 是 1 |
== != |
相等、不相等 | age == 18 |
> >= < <= |
比大小 | score >= 60 |
&& |
两个条件都成立 | 年龄合适并且成绩合格 |
|| |
至少一个条件成立 | 周六或者周日 |
! |
把真假反过来 | !passed |
注意:= 是赋值,== 才是比较。
1. && 和 || 为什么常用
逻辑运算把几个真假条件组合起来。比如需要同时满足“年龄不小于 18”和“考试通过”,就用 &&。
它还能让我们先检查数据是否安全,再继续使用数据:&& 左边为假时,不再计算右边;|| 左边为真时,不再计算右边。这叫短路。
先看一个条件组合,再看一个空值检查:
java
int age = 20;
boolean passed = true;
System.out.println(age >= 18 && passed); // true
String text = null;
// 左边为 false 就不执行右边,避免对 null 调用 isEmpty()。
boolean hasText = text != null && !text.isEmpty();
System.out.println(hasText); // false
第二个判断先检查 text 是否为空。因为它确实是 null,右边的 isEmpty() 不会执行,因此不会出现空指针异常。
&、| 也能用于布尔值,但正常情况下会计算两边。写条件判断时,通常先使用 &&、||。
2. 位运算:按二进制的每一位计算
位运算是对整数的二进制位进行计算。
它常用于标志和状态组合。理解时先不用急着写复杂技巧,我们拿小整数对照每一位,就能看清规则。
text
10 的二进制:1010
3 的二进制:0011
异或后的结果:1001,也就是十进制 9
| 运算 | 每一位怎么处理 |
|---|---|
& |
两边都是 1 才得到 1 |
| |
至少一边是 1 就得到 1 |
^ |
两边不同才得到 1 |
~ |
0 和 1 互换 |
java
// 按二进制逐位计算:10 是 1010,5 是 0101。
System.out.println(10 & 5); // 0
System.out.println(10 | 5); // 15
System.out.println(10 ^ 3); // 9
System.out.println(~5); // -6
System.out.println(2 << 1); // 4,向左移动一位
System.out.println(8 >> 1); // 4,向右移动一位
System.out.println(-1 >>> 1); // 2147483647,左侧补 0
对整数使用 &、|、^ 是位运算;对布尔值使用它们则是逻辑运算。布尔异或的意思是“两边真假不同”。
3. if:根据条件选择一段代码
if 根据条件是否成立,选择要执行的代码。
例如成绩不同,提示就不同。我们按“无效、优秀、及格、不及格”的顺序判断:
java
int score = 85;
// 先排除无效成绩,再判断等级;命中一个分支后不会继续判断后面的分支。
if (score < 0 || score > 100) {
System.out.println("成绩无效");
} else if (score >= 90) {
System.out.println("优秀");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
结果是 及格。多个条件从上往下检查,找到第一个成立的分支后,就不会再执行其他分支。
范围判断,例如“分数不小于 60”,适合用 if。
4. switch:按具体值选择
switch 根据某个值匹配相应分支。
如果不是判断分数范围,而是“1 表示星期一,2 表示星期二”,这种明确的值适合用 switch。先看传统写法:
java
int day = 2;
switch (day) {
case 1:
System.out.println("星期一");
// 结束 switch,避免继续执行后面的 case。
break;
case 2:
System.out.println("星期二");
break;
default:
System.out.println("其他日期");
}
结果是 星期二。default 用来处理没有匹配到的情况。
这种冒号写法中,如果省略 break,可能继续执行后面的分支。除非故意这样设计,否则要注意结束当前分支。
Java 14 起还可以把 switch 用作表达式,直接得到一个值:
java
int day = 2;
// 这里的 switch 会产生一个结果,用 name 接住它。
String name = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
default -> "其他日期";
};
System.out.println(name); // 星期二
这里 -> 形式不会自动接着执行下一个分支。
5. 自增与自减
a++ 是“先拿旧值,再加一”;++a 是“先加一,再拿新值”。
循环中经常需要把次数加一。如果一边加一、一边把结果赋给另一个变量,这两种写法的区别就出现了:
java
int a = 3;
// 先把旧值 3 交给 first,再让 a 增加到 4。
int first = a++;
System.out.println(first); // 3
System.out.println(a); // 4
int b = 3;
// 先让 b 增加到 4,再把新值交给 second。
int second = ++b;
System.out.println(second); // 4
System.out.println(b); // 4
单独写一行 a++; 或 ++a;,最终都是加一。自减 -- 同理。
不要为了炫技,把一个变量的多次自增塞进同一个表达式。
6. for:知道重复次数时使用
for 用来重复执行一段代码。
比如想输出 1 到 3,不必手写三条输出。让变量从 1 开始,每次增加一,到超过 3 为止:
java
// 从 1 开始,每轮加 1;超过 3 时结束循环。
for (int i = 1; i <= 3; i++) {
System.out.println(i);
}
输出 1、2、3。执行顺序是:设置初值 → 判断条件 → 执行循环体 → i++ → 再判断条件。
7. while 与 do-while
while 先判断,再执行。适合“条件还成立,就继续做”的情况。
例如读取数据时,未必提前知道读多少次。这里先用一个计数例子,看清条件和变化放在哪里:
java
int count = 1;
while (count <= 3) {
System.out.println(count);
// 更新条件中的变量,否则 count 一直是 1,循环就停不下来。
count++;
}
do-while 先执行,再判断,所以循环体至少执行一次。
java
int count = 5;
// 先执行一次再检查条件,所以 count 初始是 5 也会输出一次。
do {
System.out.println(count);
count++;
} while (count <= 3);
虽然条件不成立,这个例子仍会输出一次 5。
8. 增强 for:逐个取出元素
增强 for 用来依次取出数组或集合里的元素。
如果只关心每个成绩,不需要下标,就可以省去下标控制,直接这样写:
java
int[] scores = {80, 90, 100};
// 每次取出一个成绩,放进 score,不需要自己写下标。
for (int score : scores) {
System.out.println(score);
}
读作“从 scores 中依次取出一个元素,叫作 score”。数组和许多集合都可以这样遍历。
9. 嵌套循环:打印乘法表
嵌套循环就是一个循环里再放一个循环。
乘法表既有行,又有每行里的项目,正好需要两层控制。我们让外层选行、内层选列:
java
for (int row = 1; row <= 9; row++) {
// 第几行就输出几项,例如第三行只算 1×3、2×3、3×3。
for (int column = 1; column <= row; column++) {
System.out.print(column + "×" + row + "=" + column * row + " ");
}
// 这一行的乘法算完,再换到下一行。
System.out.println();
}
外层控制第几行,内层控制这一行输出几项。print 不换行,println 换行。
10. break 和 continue
break:结束当前循环。continue:跳过这一轮,继续下一轮。
遍历时,有时要跳过某一项,有时要提前停止。下面让 2 被跳过,让循环到 4 时结束:
java
for (int i = 1; i <= 5; i++) {
if (i == 2) {
// 跳过这轮剩下的代码,所以不输出 2。
continue;
}
if (i == 4) {
// 结束整个循环,所以 4 和后面的 5 都不输出。
break;
}
System.out.println(i);
}
只输出 1 和 3。到 2 时跳过,到 4 时整个循环结束。
11. 先记住这几件事
- 条件判断常用
&&、||,它们会短路。 if适合范围判断,switch适合具体值的匹配。while可能一次都不执行,do-while至少执行一次。break结束循环,continue跳过这一轮。

评论