「Java教案」算术运算符与表达式
课程目标
1.知识目标
- 能够区分Java运算符的种类,例如,算术、赋值、关系、逻辑、位运算等。
- 能够区分Java各类运算符的功能和使用场景。
- 能够根据表达式的构成和计算规则,写出正确的表达式。
- 能够根据运算符优先级与结合性,正确写成符合需求的表达式。
2.能力目标
- 能根据程序需求正确编写包含复合运算符的表达式。
- 能根据运算符优先级规则优化代码逻辑。
3.思政目标
- 培养严谨细致的编码习惯。
- 强调代码规范与可读性。
- 激发逻辑思维与问题拆解能力。
教学内容
1.运算符分类
- 算术运算符:+、-、*、/、%
- 赋值运算符:=、+=、-=、*=、/=
- 关系运算符:==、!=、>、<、>=、<=
- 逻辑运算符:&&、||、!
- 位运算符:&、|、^、~、<<、>>
2.表达式
- 表达式的定义与组成
- 表达式的计算规则
3.运算符优先级与结合性
- 优先级规则
- 结合性规则
重点分析
难点分析
教学活动设计
概念引入
1.运算符分类与功能
运算符是用于执行特定数学或逻辑操作的符号。Java提供了丰富的运算符集,可以分为以下几类:
- 算术运算符:用于基本的数学运算
基础运算符:+(加)、-(减)、*(乘)、/(除)、%(取模-求余数)
复合运算符:++(自加)、--(自减)
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
- 比较运算符:用于比较两个数的值,返回的结果为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
- 逻辑运算符:用于布尔逻辑运算,返回的结果为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 << 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)
- 赋值运算符:给变量赋值
直接赋值:=
复合赋值:+=(加后赋值)、-=(减后赋值)、*=(乘后赋值)、/=(除后赋值)、%=(取模后赋值)、&=(位与后赋值)、|=(位或后赋值)、^=(位异或后赋值)、<<=(左移后赋值)、>>=(右移后赋值)、>>>=(无符号右移后赋值)
int age = 20;
String status = (age >= 18) ? "成人" : "未成年";
System.out.println(status); // 成人
2.表达式与求值规则
- 表达式是由变量、运算符、方法调用等组成的语法结构,它能计算得到一个确定的值。
- 表达式的基本特征
表达式由操作数和运算符组成:如a + b中,a和b是操作数,+是运算符。
表达式计算后会得到一个特定类型的值。
表达式中可以包含其他表达式。
表达式的结果可以赋给变量。
- 表达式的类型:
算术表达式:由算术运算符组成的表达式。
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; // 复合赋值
- 表达式的求值顺序规则
运算符优先级:优先级高的运算符先计算。
结合性:相同优先级的运算符按结合方向计算。
括号优先:括号内的表达式先计算。
int result = 5 + 3 * 2; // 先乘后加,结果为11
int result2 = (5 + 3) * 2; // 先括号内,结果为16
3.数据类型转换规则
Java中的数据类型转换分为两大类:自动类型转换(隐式转换)和强制类型转换(显式转换)。
- 自动类型转换(隐式转换/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
- 强制类型转换(显式转换/Narrowing Conversion)
当要将大范围类型转换为小范围类型时,必须使用强制类型转换。
基本语法:(targetType) value
数值类型的强制转换
double d = 100.04;
long l = (long)d; // l=100,小数部分截断
int i = (int)l; // i=100float f = 3.14f;
short s = (short)f; // s=3
可能的数据丢失
int i = 257;
byte b = (byte)i; // b=1 (因为byte范围是-128~127)
// 257-256=1double 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'
- 表达式中的类型提升规则
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=10System.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%)
- 课堂练习的完成程度(20%)
- 编写代码的规范性与添加注释的规范性(10%)
- 参与小组讨论和解决问题的能力(10%)
2.终结性考核(60%)
- 理论测试(20%)
- 综合项目(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);
相关文章:

「Java教案」算术运算符与表达式
课程目标 1.知识目标 能够区分Java运算符的种类,例如,算术、赋值、关系、逻辑、位运算等。能够区分Java各类运算符的功能和使用场景。能够根据表达式的构成和计算规则,写出正确的表达式。能够根据运算符优先级与结合性ÿ…...
Ubuntu开机黑屏现象的常见解决方案详解
Ubuntu开机黑屏现象的常见解决方案详解 Ubuntu作为一款流行的Linux发行版,因其开源性和灵活性受到广泛欢迎。然而,用户在使用过程中可能会遇到开机黑屏的问题,即系统启动后屏幕完全无显示,仅留下光标闪烁或黑屏界面。这种问题可能…...
黑马程序员C++核心编程笔记--4 类和对象--多态
1.多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静态多态: 函数重载和运算符重载属于静态多态,复用函数名动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: -静态多态的函数地址早绑定 - 编译阶段确定函数地址 -动态多…...

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

[java]eclipse中windowbuilder插件在线安装
目录 一、打开eclipse 二、打开插件市场 三、输入windowbuilder,点击install 四、进入安装界面 五、勾选我同意... 重启即可 一、打开eclipse 二、打开插件市场 三、输入windowbuilder,点击install 四、进入安装界面 五、勾选我同意... 重启即可...

Ubuntu20.04服务器开启路由转发让局域网内其他电脑通过该服务器连接外网
要让你的 Ubuntu作为路由器,通过 Wi-Fi 上网,并给连接到 UsbNetwork 的设备提供网络,需要做以下配置: 1. 网络拓扑 [互联网] ← (Wi-Fi, wlo1) → [Ubuntu] ← (USB网络/USB以太网, UsbNetwork) → [设备]Ubuntu: Wi-…...

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

Windows | 总误按Num Lock?修改注册表永久禁用Numlk键使小键盘一直输入数字
先说需修改注册表的位置与键值 路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout\ 二进制键:Scancode Map 键值: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 45 00 00 00 00 00 00 00 00 00如下图: …...

2.RV1126-OPENCV Mat理解和AT函数
一.Mat概念 Mat 是整个图像存储的核心也是所有图像处理的最基础的类,Mat 主要存储图像的矩阵类型,包括向量、矩阵、灰度或者彩色图像等等。Mat由两部分组成:矩阵头,矩阵数据。矩阵头是存储图像的长度、宽度、色彩信息等头部信息&a…...
Go 语言 + Word 文档模板:WordZero 引擎如何让企业文档处理效率提升 300%?
前言 在企业级应用开发中,自动化生成Word文档一直是个令人头疼的需求。传统的方案要么依赖于复杂的Office COM组件,要么使用功能有限的第三方库。今天为大家介绍一个纯Go语言实现的Word操作库——WordZero,特别是其强大的模板引擎功能&#…...

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

循序渐进 Android Binder(一):IPC 基本概念和 AIDL 跨进程通信的简单实例
Binder 给人的第一印象是”捆绑者“,即将两个需要建立关系的事物用某些工具束缚在一起。在 Android 中,Binder 是一种高效的跨进程通信(IPC)机制,它将可以将运行在不同进程中的组件进行绑定,以实现彼此通信…...

网络安全之Web渗透加解密
项目基本使用 准备环境: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,连…...
Leetcode 3567. Minimum Absolute Difference in Sliding Submatrix
Leetcode 3567. Minimum Absolute Difference in Sliding Submatrix 1. 解题思路2. 代码实现 题目链接:3567. Minimum Absolute Difference in Sliding Submatrix 1. 解题思路 这一题想了一下,没想到啥好的思路,就是暴力直接求解了一下&am…...

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

【机器学习基础】机器学习入门核心算法:集成学习(Ensemble Learning)
机器学习入门核心算法:集成学习(Ensemble Learning) 1. 算法逻辑核心逻辑: 2. 算法原理与数学推导2.1 Bagging(Bootstrap Aggregating)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 🗂️1.1 将文档拆分为chunks1.2 词嵌入1.3 构建向量数据库Nearest Neighbor search algorithm (最近邻搜索算法)Distances (距离)点积(Dot Product&…...

pyspark实践
1。pyspark是什么 PySpark 是 Apache Spark 的官方 Python 接口,它使得 Python 开发者能够访问 Spark 的核心功能,如: Spark SQL:用于执行 SQL 查询以及读取数据的库,支持多种数据格式和存储系统。py.qizhen.xyz Data…...
内网怎么映射外网ip? 内网的地址快速映射给外网访问用方法
本文章向大家介绍内网怎么映射外网ip,主要包括如何将内网 IP 端口的网络服务映射到外网使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。内容主要包括路由映射公网IP和无公网IP通过nat123映射…...

【深度学习新浪潮】多模态模型如何处理任意分辨率输入?
多模态模型处理任意分辨率输入的能力主要依赖于架构设计的灵活性和预处理技术的结合。以下是核心方法及技术细节: 一、图像模态的分辨率处理 1. 基于Transformer的可变补丁划分(ViT架构) 补丁化(Patch Embedding): 将图像分割为固定大小的补丁(如1616或3232像素),不…...
ZYNQ移植FreeRTOS和固化和openAMP双核
想象一下:一颗拥有“双脑”的ZYNQ芯片,左脑运行Linux处理复杂网络协议,右脑运行FreeRTOS以微秒级精度控制电机,双脑通过“量子纠缠”般的技术实时对话——这就是OpenAMP框架创造的工程奇迹!今天,我们将揭开这项技术的神秘面纱,带你从零构建一个双核异构的智能系统。 🧠…...

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

UE5蓝图暴露变量,在游戏运行时修改变量实时变化、看向目标跟随目标Find Look at Rotation、修改玩家自身弹簧臂
UE5蓝图中暴露变量,类似Unity中public一个变量,在游戏运行时修改变量实时变化 1,添加变量 2,设置变量的值 3,点开小眼睛,此变量显示在编辑器中,可以运行时修改 看向目标跟随目标Find Look at R…...
C语言进阶知识:深入探索编程的奥秘
一、指针:C语言的灵魂 指针是C语言中最核心的概念之一,它为程序员提供了对内存的直接操作能力。指针变量存储的是一个地址,通过这个地址可以访问和修改内存中的数据。 (一)指针的基本操作 指针的声明 指针的声明格式…...
机器视觉2D定位引导一般步骤
机器视觉的2D定位引导是工业自动化中的核心应用,主要用于精确确定目标物体的位置(X, Y坐标)和角度(旋转角度θ),并引导机器人或运动机构进行抓取、装配、对位、检测等操作。其一般步骤可概括如下: 一、系统规划与硬件选型 明确需求: 定位精度要求(多少毫米/像素,多少…...

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

FastAPI安全认证:从密码到令牌的魔法之旅
title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdragon excerpt: 在FastAPI中实现OAuth2密码流程的认证机制。通过创建令牌端点,用户可以使用用户名和密码获取JWT访问令牌。代码示例展示了如何使用Cry…...
人工智能时代教师角色的重塑与应对策略研究:从理论到实践的转型
一、引言 1.1 研究背景 近年来,人工智能技术迅猛发展,已经逐渐渗透到社会的各个领域,对人类的生产、生活和学习方式产生了深远影响。作为社会发展的重要组成部分,教育领域也不可避免地受到人工智能的冲击,正经历着前…...

java对接bacnet ip协议(跨网段方式)
1、环境准备 #maven环境<repositories><repository><id>ias-releases</id><url>https://maven.mangoautomation.net/repository/ias-release/</url></repository></repositories><dependencies><dependency><…...