三:运算符与表达式——让数据参与计算

一、回顾与本篇目标

上一篇你学会了变量和数据类型。你知道变量是一个带名字的存储空间,声明时要用 int age = 28; 这样的语法,Java 有八种基本数据类型,最常用的是 intdoublecharboolean

但光有变量还不够——变量只是把数据存起来了,真正让程序有用的是对这些数据进行计算。比如:计算购物车总价、判断年龄是否满 18 岁、统计考试成绩是否及格。这些都需要运算符

运算符就像数学中的加减乘除符号——它们告诉计算机要对数据做什么操作。Java 中的运算符分为好几类:算术运算符、比较运算符、逻辑运算符、赋值运算符。这一篇把它们全部讲透。

本篇的目标:

  1. 学会使用算术运算符进行数学计算
  2. 学会使用比较运算符判断大小、相等
  3. 学会使用逻辑运算符组合多个条件
  4. 理解赋值运算符和自增自减
  5. 掌握运算符的优先级

二、表达式和运算符是什么

表达式是由变量、字面量、运算符组成的能计算出结果的式子。就像数学课上学的一样——3 + 5 是一个表达式,计算结果是 8。

在 Java 中:

int sum = 10 + 20;          // 10 + 20 是表达式,结果 30
int result = sum * 2;       // sum * 2 是表达式,结果 60
boolean isAdult = age >= 18; // age >= 18 是表达式,结果 true 或 false

表达式中的 +*>= 这些符号就是运算符。它们告诉计算机要对数据做什么操作。

三、算术运算符——数学计算

算术运算符用来做数学计算,和你在数学课上学的一样:

运算符 含义 示例 结果
+ 加法 10 + 3 13
- 减法 10 - 3 7
* 乘法 10 * 3 30
/ 除法 10 / 3 3(注意!)
% 取余数 10 % 3 1

除法 / 有一个非常重要的规则:两个整数相除,结果还是整数——小数部分会被直接丢弃(不是四舍五入)。

int a = 10;
int b = 3;
int result = a / b;
System.out.println(result);  // 输出 3,不是 3.333!

// 要得到小数结果,至少有一边是小数类型
double result2 = 10.0 / 3;       // 3.3333333
double result3 = 10 / 3.0;       // 3.3333333
double result4 = (double) a / b; // 3.3333333(强制转换)

取余数 % 就是求“除不尽的那部分”。比如 10 ÷ 3 = 3 余 1,所以 10 % 3 等于 1。这在判断奇偶性(n % 2 == 0 表示偶数)、循环中每隔几个执行一次等场景非常有用。

算术运算的完整示例

public class ArithmeticDemo {
    public static void main(String[] args) {
        int a = 17;
        int b = 5;

        System.out.println("a = " + a + ", b = " + b);
        System.out.println("a + b = " + (a + b));   // 22
        System.out.println("a - b = " + (a - b));   // 12
        System.out.println("a * b = " + (a * b));   // 85
        System.out.println("a / b = " + (a / b));   // 3(整数除法)
        System.out.println("a % b = " + (a % b));   // 2(17除以5余2)
        System.out.println("a / b 的小数结果 = " + (double) a / b);  // 3.4
    }
}

四、比较运算符——判断大小和相等

比较运算符用来比较两个值之间的关系。比较的结果是一个 boolean 值——true(真)或 false(假)。

运算符 含义 示例 结果
> 大于 10 > 5 true
< 小于 10 < 5 false
>= 大于等于 10 >= 10 true
<= 小于等于 5 <= 3 false
== 等于 10 == 10 true
!= 不等于 10 != 5 true

特别注意:判断相等用两个等号 ==不是一个等号 =。一个等号是赋值,两个等号是比较。这是初学者最容易犯的错误之一。

int age = 20;

// 判断年龄是否大于等于 18
boolean isAdult = age >= 18;
System.out.println("是否成年:" + isAdult);  // true

// 判断分数是否及格
int score = 85;
boolean isPass = score >= 60;
System.out.println("是否及格:" + isPass);   // true

// 判断两个数字是否相等
int x = 10;
int y = 20;
System.out.println(x == y);   // false
System.out.println(x != y);   // true

五、逻辑运算符——组合多个条件

有时候一个条件不够,需要同时满足多个条件,或者满足其中任意一个就行。逻辑运算符就是用来连接多个条件的。

运算符 含义 示例 结果
&& 并且(AND)——两边都成立才为真 age >= 18 && age <= 60 年龄在 18 到 60 之间
|| 或者(OR)——任意一边成立就为真 score < 0 || score > 100 分数超出有效范围
! 取反(NOT)——真假颠倒 !isLoggedIn 如果未登录则为 true

&&(并且)

两边条件都成立时,整个表达式才成立。就像高考录取——既要总分过线,又要单科过线。

int age = 25;
boolean hasTicket = true;

// 必须年满 18 岁,并且有票,才能入场
boolean canEnter = age >= 18 && hasTicket;
System.out.println("能否入场:" + canEnter);  // true

// 如果有一个条件不满足
boolean noTicket = false;
boolean canEnter2 = age >= 18 && noTicket;
System.out.println("能否入场:" + canEnter2);  // false

||(或者)

两边条件任意一个成立时,整个表达式就成立。就像商场促销——有会员卡可以打折,或者消费满 500 也可以打折。

boolean isMember = false;
double totalPrice = 600;

// 是会员 或者 消费满 500,都可以享受折扣
boolean canDiscount = isMember || totalPrice >= 500;
System.out.println("能否享受折扣:" + canDiscount);  // true

!(取反)

true 变成 false,把 false 变成 true

boolean isLoggedIn = false;

// 如果 没有 登录,就提示请登录
if (!isLoggedIn) {
    System.out.println("请先登录");
}

六、赋值运算符——存值和简写

赋值运算符最基础的就是 =——把右边的值存进左边的变量。除此之外,Java 还提供了一些简写形式——当你要在变量现有值的基础上做运算并存回去时,可以用简写。

运算符 含义 示例 等价于
= 赋值 x = 10
+= 加后赋值 x += 5 x = x + 5
-= 减后赋值 x -= 3 x = x - 3
*= 乘后赋值 x *= 2 x = x * 2
/= 除后赋值 x /= 4 x = x / 4
%= 取余后赋值 x %= 3 x = x % 3
int score = 80;
score += 10;  // score = 90(加了 10 分)
score -= 5;   // score = 85(扣了 5 分)
score *= 2;   // score = 170(翻倍)
score /= 3;   // score = 56(除以 3,整数除法)
System.out.println(score);  // 56

七、自增和自减——加 1 和减 1 的快捷方式

在编程中,让一个变量加 1 或减 1 是非常常见的操作——比如计数器、循环索引。Java 提供了更简洁的写法:

运算符 含义 示例 等价于
++ 自增(加 1) x++++x x = x + 1
-- 自减(减 1) x----x x = x - 1

前置和后置的区别++ 写在变量前面还是后面,单独写一行时效果相同。但如果它和其他操作混在一起,顺序就有影响了:

int a = 10;
int b = a++;    // 后置:先把 a 的值赋给 b,然后 a 再加 1
// 结果:b = 10, a = 11

int c = 10;
int d = ++c;    // 前置:先让 c 加 1,然后把新值赋给 d
// 结果:d = 11, c = 11

建议:刚开始编程时,把 ++-- 单独写一行,不要和其他操作混在一起。这样代码最清晰,不会产生歧义。

int count = 0;
count++;  // 清晰:count 增加 1
System.out.println(count);  // 1

八、运算符的优先级

当一个表达式中有多个运算符时,哪个先算?这和数学中的“先乘除后加减”是同一个道理。

优先级从高到低排列(不需要死记,用到的时候查表就行):

优先级 运算符 说明
最高 () 括号——最优先
! ++ -- 取反、自增、自减
* / % 乘、除、取余
+ - 加、减
> < >= <= 比较
== != 相等、不等
&& 逻辑与
最低 || 逻辑或

不要依赖记忆来写复杂表达式——用括号明确你的意图。 括号不仅让代码正确,更让读代码的人(包括三个月后的你自己)一眼就能看懂。

// 不清晰:依赖优先级
int result = 10 + 5 * 2;  // 20(先乘后加)

// 清晰:用括号明确意图
int result2 = (10 + 5) * 2;  // 30(先加后乘)

九、综合演示:购物结算小程序

下面这个程序综合运用了本篇学的所有运算符:

public class ShoppingDemo {
    public static void main(String[] args) {
        // 商品信息
        String productName = "Java 编程书";
        double unitPrice = 59.80;        // 单价
        int quantity = 3;                 // 数量
        double discount = 0.85;           // 折扣率(8.5折)

        // 计算金额
        double originalTotal = unitPrice * quantity;    // 原价总价
        double finalTotal = originalTotal * discount;   // 折后总价
        double saved = originalTotal - finalTotal;      // 省了多少钱

        // 判断是否包邮
        boolean freeShipping = finalTotal >= 99;

        // 判断是否为整数数量(用取余判断)
        boolean isBulk = quantity >= 5;

        // 输出结果
        System.out.println("========== 购物结算 ==========");
        System.out.println("商品:" + productName);
        System.out.println("单价:¥" + unitPrice);
        System.out.println("数量:" + quantity);
        System.out.println("折扣:" + (int)(discount * 100) + "%");
        System.out.println("-----------------------------");
        System.out.println("原价总价:¥" + originalTotal);
        System.out.println("折后总价:¥" + finalTotal);
        System.out.println("为您节省:¥" + saved);
        System.out.println("-----------------------------");
        System.out.println("是否包邮:" + freeShipping);
        System.out.println("是否批发(>=5本):" + isBulk);
        System.out.println("==============================");
    }
}

输出:

========== 购物结算 ==========
商品:Java 编程书
单价:¥59.8
数量:3
折扣:85%
-----------------------------
原价总价:¥179.39999999999998
折后总价:¥152.48999999999998
为您节省:¥26.91
-----------------------------
是否包邮:true
是否批发(>=5本):false
==============================

注意到价格出现了很多位小数(179.39999999999998)——这是计算机浮点数的精度问题,几乎所有编程语言都有这个现象。处理金额时通常用int存“分”而不是用double存“元”,或者使用BigDecimal类。现在知道有这个问题就行,后面会深入讨论。

十、本篇动手练习

练习 1:计算圆的面积和周长

新建 Practice3_1.java。声明圆的半径 radius = 5.0,声明常量 PI = 3.14159。计算面积(PI × radius × radius)和周长(2 × PI × radius),打印结果。

练习 2:闰年判断

新建 Practice3_2.java。声明一个年份变量 int year = 2024;。用逻辑运算符判断它是不是闰年。闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。打印判断结果。

练习 3:数字拆分

新建 Practice3_3.java。声明一个三位整数 int num = 357;。用除法和取余运算分别取出它的百位、十位、个位数字,分别打印出来。

练习 4:温度转换器

新建 Practice3_4.java。声明一个摄氏温度 double celsius = 30.0;。用公式 华氏度 = 摄氏度 × 9/5 + 32 计算华氏温度。注意 9/5 的问题。同时判断这个温度是否超过 38°C(高温预警),打印所有结果。

十一、本篇小结

这一篇你学会了 Java 中的运算符:

  • 算术运算符+-*/%。整数相除结果是整数(小数被截断)。% 是取余数。
  • 比较运算符><>=<===!=。结果是一个 boolean 值(truefalse)。判断相等用两个等号 ==,赋值用一个等号 =
  • 逻辑运算符&&(并且)、||(或者)、!(取反)。用来组合多个条件。
  • 赋值运算符=+=-=*=/=%=。简写形式让代码更简洁。
  • 自增自减++--。建议单独写一行,避免和其他操作混用。
  • 运算符优先级:不确定的时候加括号。括号是最清晰的表达方式。

运算符是让程序“动起来”的关键——变量存数据,运算符处理数据。下一篇,我们学习条件判断——让程序根据不同情况做不同的事情。

下一篇预告

下一篇——《条件判断——让程序做选择》:if/else if/else 分支结构、switch/case 多分支选择、三元运算符。你会写出能根据不同分数显示不同等级的评分程序。

Java 零基础入门,每周更新。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容