「Java教案」算术运算符与表达式

news2025/7/21 6:20:23

课程目标

1.知识目标

  1. 能够区分Java运算符的种类,例如,算术、赋值、关系、逻辑、位运算等。
  2. 能够区分Java各类运算符的功能和使用场景。
  3. 能够根据表达式的构成和计算规则,写出正确的表达式。
  4. 能够根据运算符优先级与结合性,正确写成符合需求的表达式。

2能力目标

  1. 能根据程序需求正确编写包含复合运算符的表达式。
  2. 能根据运算符优先级规则优化代码逻辑。

3思政目标

  1. 培养严谨细致的编码习惯。
  2. 强调代码规范与可读性。
  3. 激发逻辑思维与问题拆解能力。

教学内容

1运算符分类

  1. 算术运算符:+、-、*、/、%
  2. 赋值运算符:=、+=、-=、*=、/=
  3. 关系运算符:==、!=、>、<、>=、<=
  4. 逻辑运算符:&&、||、!
  5. 位运算符:&、|、^、~、<<、>>

2表达式

  1. 表达式的定义与组成
  2. 表达式的计算规则

3运算符优先级与结合性

  1. 优先级规则
  2. 结合性规则

重点分析

难点分析

教学活动设计

概念引入

1运算符分类与功能

运算符是用于执行特定数学或逻辑操作的符号。Java提供了丰富的运算符集,可以分为以下几类:

  1. 算术运算符:用于基本的数学运算

基础运算符:+(加)、-(减)、*(乘)、/(除)、%(取模-求余数)

复合运算符:++(自加)、--(自减)

int a = 10, b = 3;
System.out.println(a + b);  // 13
System.out.println(a - b);  // 7
System.out.println(a * b);  // 30
System.out.println(a / b);  // 3 (整数除法)
System.out.println(a % b);  // 1
  1. 比较运算符:用于比较两个数的值,返回的结果为true(真)和false(假)。包括,==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
int x = 5, y = 10;
System.out.println(x == y);  // false
System.out.println(x != y);  // true
System.out.println(x > y);   // false
  1. 逻辑运算符:用于布尔逻辑运算,返回的结果为true(真)和false(假)。

逻辑与:&&(短路行为,左侧表达式的值为false时,右侧表达式跳过不运行)

逻辑或:||(短路行为,左侧表达式的值为true时,右侧表达式跳过不运行)

逻辑非:!

boolean t = true, f = false;
System.out.println(t && f);  // false
System.out.println(t || f);  // true
System.out.println(!t);      // false
  1. 位运算符:对整数进行位级运算。

按位操作:&(与)、|(或)、^(异或)、~(取反)

位移操作:<<(左移,例如1 << 3结果为8)、>>(右移,例如8 >> 2结果为2)、>>>(无符号右移)

int num1 = 5;  // 0101
int num2 = 3;  // 0011
System.out.println(num1 & num2);  // 1 (0001)
System.out.println(num1 | num2);  // 7 (0111)
System.out.println(num1 << 1);    // 10 (1010)
  1. 赋值运算符:给变量赋值

直接赋值:=

复合赋值:+=(加后赋值)、-=(减后赋值)、*=(乘后赋值)、/=(除后赋值)、%=(取模后赋值)、&=(位与后赋值)、|=(位或后赋值)、^=(位异或后赋值)、<<=(左移后赋值)、>>=(右移后赋值)、>>>=(无符号右移后赋值)

int age = 20;
String status = (age >= 18) ? "成人" : "未成年";
System.out.println(status);  // 成人

2.表达式与求值规则

  1. 表达式是由变量、运算符、方法调用等组成的语法结构,它能计算得到一个确定的值。
  2. 表达式的基本特征

表达式由操作数和运算符组成:如a + b中,ab是操作数,+是运算符。

表达式计算后会得到一个特定类型的值。

表达式中可以包含其他表达式。

表达式的结果可以赋给变量。

  1. 表达式的类型:

算术表达式:由算术运算符组成的表达式。

int result = 10 + 5 * 3;  // 结果为25
double area = Math.PI * 10 * 10;    // 结果为:314.1592653589793

关系表达式:比较两个值的关系,返回布尔值。

boolean isEqual = (10 == 20);   // 结果:false
boolean isGreater = (10 > 5);   // 结果:true

逻辑表达式:由逻辑运算符组成,返回布尔值。

boolean isValid = (20 >= 18) && (false);  // 结果:false
boolean isTrue = !(10 == 10); // 结果:false

赋值表达式:包含赋值运算符的表达式。

int x = 10;  // 简单赋值
x += 5;      // 复合赋值
  1. 表达式的求值顺序规则

运算符优先级:优先级高的运算符先计算。

结合性:相同优先级的运算符按结合方向计算。

括号优先:括号内的表达式先计算。

int result = 5 + 3 * 2;     // 先乘后加,结果为11
int result2 = (5 + 3) * 2;  // 先括号内,结果为16

3.数据类型转换规则

Java中的数据类型转换分为两大类:自动类型转换(隐式转换)和强制类型转换(显式转换)。

  1. 自动类型转换(隐式转换/Widening Conversion)

当满足以下条件时,Java会自动进行类型转换:①两种数据类型兼容;②目标类型比源类型范围更大。

数值类型的自动转换顺序

转换规则:①小容量类型自动转换为大容量类型;②char可以自动转换为int及以上类型;③byte、short、char参与运算时自动提升为int。

示例:

int a = 100;
long b = a;  // 自动转换
float c = b; // 自动转换

char ch = 'A';
int i = ch;  // 自动转换,i=65

示例:自动转换的特殊情况

byte b = 42;
char c = 'a';
short s = 1024;
int i = 50000;
float f = 5.67f;
double d = .1234;

// 表达式中的自动提升
double result = (f * b) + (i / c) - (d * s);
// b自动转为float,c自动转为int,s自动转为double
  1. 强制类型转换(显式转换/Narrowing Conversion)

当要将大范围类型转换为小范围类型时,必须使用强制类型转换。

基本语法:(targetType) value

数值类型的强制转换

double d = 100.04;
long l = (long)d;  // l=100,小数部分截断
int i = (int)l;    // i=100

float f = 3.14f;
short s = (short)f; // s=3

可能的数据丢失

int i = 257;
byte b = (byte)i;  // b=1 (因为byte范围是-128~127)
// 257-256=1

double d = 300.678;
int f = (int)d;    // f=300,小数部分丢失

char的特殊转换

int i = 65;
char ch1 = (char)i;  // ch1='A'

byte b = 66;
char ch2 = (char)b;  // ch2='B'
  1. 表达式中的类型提升规则

byte、short、char自动提升为int:

byte a = 40;
byte b = 50;
byte c = a + b; // 错误!a+b自动转为int
byte d = (byte)(a + b); // 正确

表达式中最高级的类型决定最终类型

int i = 10;
long l = 100;
float f = 3.5f;
double d = 4.5;

double result = i + l + f + d; // 全部提升为double

4.运算符优先级及结合性

运算符优先级决定了表达式中运算符的执行顺序。当表达式包含多个运算符时,优先级高先计算。如果运算符优先级相同,再根据运算符的结合性(从左到右或从右到左)来决定计算顺序。

运算符优先级表(从高到低)

案例解析

案例1:计算商品折扣价(含类型转换)

public class Test {
    public static void main(String[] args) {
        double price = 100.0;
        int discountRate = 20; // 折扣率20%
        double finalPrice = price * (1 - discountRate / 100.0); // 关键:100.0强制类型转换
        System.out.println("最终价格: " + finalPrice); // 输出80.0
    }
}

运行结果

最终价格: 80.0

discountRate / 100.0中,100.0将整数除法转为浮点除法。

案例2:判断闰年(含逻辑运算符优先级)

public class Test {
    public static void main(String[] args) {
        int year = 2025;
        boolean isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
        System.out.println(year + "年是闰年吗?" + isLeap); // 输出true
    }
}

运行结果

2025年是闰年吗?false

&&优先级高于||,但用括号明确条件分组更清晰。

常见错误

错误:混淆===

if (x = 5) { ... } // 编译错误:无法将int转为boolean

解决方法:强调=是赋值,==是相等比较。

错误:忽略优先级导致逻辑错误

int a = 3, b = 4, c = 5;
boolean result = a > b && b < c; // 实际计算顺序:先a>b(false),再false && ...(短路)

解决方法:用括号强制优先级,如(a > b) && (b < c)。

错误:位运算符号混淆

int x = 5;
int y = x & 2; // 按位与,结果为0(5的二进制101 & 2的二进制010)
System.out.println(y); // 输出0

解决方法:通过二进制表对比&|^的差异。

课堂练习

练习:计算表达式int x = 5; int y = x++ * 2 + --x;的值。

参考答案:y = 15(x++先赋值后自增,--x先自减后使用)。

练习:用位运算实现交换两个变量(不借助临时变量)。

参考答案:

public class Test {
    public static void main(String[] args) {
        int a = 10, b = 20;
        System.out.println("交换前:a = " + a + ", b = " + b);
        a ^= b;
        b ^= a;
        a ^= b; // 交换后a=20, b=10
        System.out.println("交换后:a = " + a + ", b = " + b);
    }
}

运行结果

交换前:a = 10, b = 20
交换后:a = 20, b = 10

练习:修复错误代码

int num = 10;
if (num = 20) { // 错误:赋值运算符误用
    System.out.println("num等于20");
}

参考答案:

int num = 10;
if (num == 20) { // 错误:赋值运算符误用
    System.out.println("num等于20");
}

课后作业

作业:编写程序,判断用户输入的年份是否为世纪年且闰年(如2000年)。

参考答案

public class Test {
    public static void main(String[] args) {
        int year = 2000;
        boolean isCenturyLeap = (year % 400 == 0);
        System.out.println(isCenturyLeap);
    }
}

运行结果

true

作业:解释1 << 3的含义,并写出其二进制运算过程。

参考答案1 << 3是Java中的左移运算符,表示将数字1的二进制形式向左移动3位,并在右侧补0。

运算结果:1 << 3 = 8(十进制)

说明:左移运算常用于高效计算2的幂次方,或位掩码(Bitmask)操作。

考核设计

1过程性考核(40%)

  1. 课堂练习的完成程度(20%)
  2. 编写代码的规范性与添加注释的规范性(10%)
  3. 参与小组讨论和解决问题的能力(10%)

2终结性考核(60%)

  1. 理论测试(20%)
  2. 综合项目(40%)

理论测试:

填空题:计算表达式5 + 3 * 2 / 4 - 1的值为________。

答案:5 + 6 / 4 - 1 = 5 + 1 - 1 = 5(整数除法结果为1)。

选择题:以下哪个表达式可能会触发短路行为?

A.if (a > 0 || b++)    B.if (a > 0 && b++)

答案:B(当a > 0为false时,b++不会执行)。

简答题:解释x ^= y ^= x ^= y的交换逻辑。

答案:通过三次异或运算实现交换,但可读性差,建议使用临时变量。

综合项目:

任务:编写程序,计算表达式(a + b) * c / d % e的值,并验证优先级规则。

示例:

int a = 5, b = 3, c = 2, d = 4, e = 2;
System.out.println((a + b) * c / d % e);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文写作核心要点

不要只读论文里的motivation和method 论文里的图表和统计特征 在论文里找到具有统计意义的东西&#xff0c;那么在语料里也肯定遵循这样的规律&#xff0c;我们就能用机器学习的方法&#xff0c; 我们再用不同方法解决&#xff0c;哪种方法好&#xff0c;就用哪种 实验分析 …

[java]eclipse中windowbuilder插件在线安装

目录 一、打开eclipse 二、打开插件市场 三、输入windowbuilder&#xff0c;点击install 四、进入安装界面 五、勾选我同意... 重启即可 一、打开eclipse 二、打开插件市场 三、输入windowbuilder&#xff0c;点击install 四、进入安装界面 五、勾选我同意... 重启即可

Ubuntu20.04服务器开启路由转发让局域网内其他电脑通过该服务器连接外网

要让你的 Ubuntu作为路由器&#xff0c;通过 Wi-Fi 上网&#xff0c;并给连接到 UsbNetwork 的设备提供网络&#xff0c;需要做以下配置&#xff1a; 1. 网络拓扑 [互联网] ← (Wi-Fi, wlo1) → [Ubuntu] ← (USB网络/USB以太网, UsbNetwork) → [设备]Ubuntu&#xff1a; Wi-…

【Oracle】TCL语言

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. TCL概述1.1 什么是TCL&#xff1f;1.2 TCL的核心功能 2. 事务基础概念2.1 事务的ACID特性2.2 事务的生命周期 3. COMMIT语句详解3.1 COMMIT基础语法3.2 自动提交与手动提交3.3 提交性能优化 4. ROLLBACK语句…

Windows | 总误按Num Lock?修改注册表永久禁用Numlk键使小键盘一直输入数字

先说需修改注册表的位置与键值 路径&#xff1a;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout\ 二进制键&#xff1a;Scancode Map 键值&#xff1a; 00 00 00 00 00 00 00 00 01 00 00 00 00 00 45 00 00 00 00 00 00 00 00 00如下图&#xff1a; …

2.RV1126-OPENCV Mat理解和AT函数

一.Mat概念 Mat 是整个图像存储的核心也是所有图像处理的最基础的类&#xff0c;Mat 主要存储图像的矩阵类型&#xff0c;包括向量、矩阵、灰度或者彩色图像等等。Mat由两部分组成&#xff1a;矩阵头&#xff0c;矩阵数据。矩阵头是存储图像的长度、宽度、色彩信息等头部信息&a…

unidbg patch 初探 微博deviceId 案例

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 看了b站迷人瑞信那个由于是…

循序渐进 Android Binder(一):IPC 基本概念和 AIDL 跨进程通信的简单实例

Binder 给人的第一印象是”捆绑者“&#xff0c;即将两个需要建立关系的事物用某些工具束缚在一起。在 Android 中&#xff0c;Binder 是一种高效的跨进程通信&#xff08;IPC&#xff09;机制&#xff0c;它将可以将运行在不同进程中的组件进行绑定&#xff0c;以实现彼此通信…

网络安全之Web渗透加解密

项目基本使用 准备环境&#xff1a;node.js python chrome npm install chrome-remote-interface pip install playwright playwright install chromium pip install mitmproxy ............... 第一步启动cdp.js。 第二步使用python .\cdp_load.py vue_demo&#xff0c;连…

【LeetCode 题解】两数之和(C++/Python 双解法):从语法到算法的全面解析

【LeetCode题解】两数之和&#xff08;C/Python双解法&#xff09;&#xff1a;从语法到算法的全面解析 一、题目描述 题目链接&#xff1a;1. 两数之和 难度&#xff1a;简单 要求&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;在数组中找出两个数…

【机器学习基础】机器学习入门核心算法:集成学习(Ensemble Learning)

机器学习入门核心算法&#xff1a;集成学习&#xff08;Ensemble Learning&#xff09; 1. 算法逻辑核心逻辑&#xff1a; 2. 算法原理与数学推导2.1 Bagging&#xff08;Bootstrap Aggregating&#xff09;2.2 Boosting2.3 Stacking 3. 模型评估评估指标基学习器选择策略 4. 应…

【TMS570LC4357】之相关驱动开发学习记录1

系列文章目录 【TMS570LC4357】之工程创建 【TMS570LC4357】之工程配置修改 【TMS570LC4357】之HALCOGEN使用 【TMS570LC4357】之相关问题及解决 ——————————————————— 前言 记录笔者在第一次使用TMS570过程中对外设驱动的一些学习碎片。 1. RTI 1.1 添…

RAG入门 - Retriever(1)

文章目录 环境准备知识库加载1. Retriever - embeddings &#x1f5c2;️1.1 将文档拆分为chunks1.2 词嵌入1.3 构建向量数据库Nearest Neighbor search algorithm &#xff08;最近邻搜索算法&#xff09;Distances &#xff08;距离&#xff09;点积&#xff08;Dot Product&…

pyspark实践

1。pyspark是什么 PySpark 是 Apache Spark 的官方 Python 接口&#xff0c;它使得 Python 开发者能够访问 Spark 的核心功能&#xff0c;如&#xff1a; Spark SQL&#xff1a;用于执行 SQL 查询以及读取数据的库&#xff0c;支持多种数据格式和存储系统。py.qizhen.xyz Data…

【深度学习新浪潮】多模态模型如何处理任意分辨率输入?

多模态模型处理任意分辨率输入的能力主要依赖于架构设计的灵活性和预处理技术的结合。以下是核心方法及技术细节: 一、图像模态的分辨率处理 1. 基于Transformer的可变补丁划分(ViT架构) 补丁化(Patch Embedding): 将图像分割为固定大小的补丁(如1616或3232像素),不…

K-匿名模型

K-匿名模型是隐私保护领域的一项基础技术&#xff0c;防止通过链接攻击从公开数据中重新识别特定个体。其核心思想是让每个个体在发布的数据中“隐匿于人群”&#xff0c;确保任意一条记录至少与其他K-1条记录在准标识符&#xff08;Quasi-Identifiers, QIDs&#xff09;上不可…

UE5蓝图暴露变量,在游戏运行时修改变量实时变化、看向目标跟随目标Find Look at Rotation、修改玩家自身弹簧臂

UE5蓝图中暴露变量&#xff0c;类似Unity中public一个变量&#xff0c;在游戏运行时修改变量实时变化 1&#xff0c;添加变量 2&#xff0c;设置变量的值 3&#xff0c;点开小眼睛&#xff0c;此变量显示在编辑器中&#xff0c;可以运行时修改 看向目标跟随目标Find Look at R…

Python-matplotlib中的Pyplot API和面向对象 API

matplotlib中的Pyplot API和面向对象 API Pyplot API&#xff08;状态机模式&#xff09;面向对象 API 详解二者差别核心区别方法命名差异注意事项差别举例 &#x1f345; Pyplot API&#xff08;状态机模式&#xff09;和面向对象 API 是两种不同的编程接口.&#x1f345; 它们…

FastAPI安全认证:从密码到令牌的魔法之旅

title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdragon excerpt: 在FastAPI中实现OAuth2密码流程的认证机制。通过创建令牌端点,用户可以使用用户名和密码获取JWT访问令牌。代码示例展示了如何使用Cry…

java对接bacnet ip协议(跨网段方式)

1、环境准备 #maven环境<repositories><repository><id>ias-releases</id><url>https://maven.mangoautomation.net/repository/ias-release/</url></repository></repositories><dependencies><dependency><…