← 返回首页
Java学习

2.Java运算符与流程控制

2026-09-19·9 次浏览
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 跳过这一轮。
补充:以后再看
  • Java 17 的常见 switch 用法支持整数中的 byte、short、char、int 及其包装类,还支持 String 和枚举;不支持 long、浮点类型和 boolean。Java 21 的模式匹配是进一步的内容。
  • switch 的引用值为 null 时,本文的写法会抛空指针异常。
  • 负数用补码表示。右移不能一概当作除法:-3 >> 1 是 -2,-3 / 2 是 -1。
  • 左移可能丢失高位;int 的实际移位距离按 32 取模,long 按 64 取模。

表达式规范 · 语句规范

── 完 ──

评论

还没有评论,来说点什么
发表评论
0 / 1000