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

article/2025/7/6 1:22:45

课程目标

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=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'
  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=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%)

  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.hkcw.cn/article/qNLxxpkDqM.shtml

相关文章

普中STM32F103ZET6开发攻略(二)

接上文&#xff1a;普中STM32F103ZET6开发攻略&#xff08;一&#xff09;-CSDN博客 各位看官老爷们&#xff0c;点击关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 目录 接上文&#xff1a;普中…

FPGA仿真中阻塞赋值(=)和非阻塞赋值(<=)区别

FPGA仿真中阻塞赋值和非阻塞赋值的区别 单独仿真小模块对但将小模块加入整个工程仿真不对就有可能是没有注意到仿真中阻塞赋值和非阻塞赋值的区别 目录 前言 一、简介 二、设计实例 三、仿真实例 1、仿真用非阻塞赋值 2、仿真用阻塞赋值 总结 前言 网上很多人介绍verilo…

蓝云APP:云端存储,便捷管理

在数字化时代&#xff0c;数据的存储和管理变得尤为重要。无论是个人用户还是企业用户&#xff0c;都面临着海量数据的存储需求。蓝云APP正是这样一款为用户提供便捷、安全、高效的云存储服务的应用程序。它不仅提供了一种方便快捷的方式来管理和存储数据&#xff0c;还通过多种…

基于FPGA的VGA显示文字和动态数字基础例程,进而动态显示数据,类似温湿度等

基于FPGA的VGA显示文字和数字 前言一、VGA显示参数二、字模生成三、代码分析1.vga_char顶层2.vga_ctrl驱动文件3.vga_pic数据准备文件 总结 前言 结合正点原子以及野火的基础例程&#xff0c;理解了VGA本身基本协议&#xff0c;VGA本身显示像素为640*480&#xff0c;因此注意生…

低能硼注入的粒子控制 Axcelis Purion高电流离子注入机近晶圆环境中的石墨衬垫

低能硼注入的粒子控制 Axcelis Purion高电流离子注入机近晶圆环境中的石墨衬垫

自适应流量调度用于遥操作:面向时间敏感网络的通信与控制协同优化框架

英文标题&#xff1a;Adaptive Flow Scheduling for Teleoperation: A Communication and Control Co-Optimization Framework over Time-Sensitive Networks 中文标题&#xff1a;自适应流量调度用于遥操作&#xff1a;面向时间敏感网络的通信与控制协同优化框架 作者信息 …

PCIe-Error Detection(一)

下表为PCIe协议中给出的错误&#xff1a; 一、可纠正错误&#xff08;Correctable Errors&#xff0c;8种&#xff09;​​ ​​检错机制​​ ​​错误名称​​​​检测层级​​​​触发条件​​​​Receiver Error​​Physical接收端均衡器&#xff08;EQ&#xff09;监测到…

记忆解码 | 从神经机制到记忆逻辑的科学探索

注&#xff1a;本文为“记忆解码”相关文章合辑。 略作重排&#xff0c;未作探究。 要做的事情全忘了&#xff1f;这 2 种方法能拯救你的记忆力 环球科学 2024 年 07 月 29 日 22:00 北京 图片来源&#xff1a;Pixabay 作者 | Sarah Raskin 译者 | 郑添惺 审校 | clefable 你…

100V离线语音通断器

客户要求&#xff0c;需要能支持宽范围的离线语音通断器&#xff0c;具体需要能支持输入电压为100V左右直流。 找方案&#xff0c;重新做板&#xff0c;终于满足了客户需求&#xff0c;外壳为之前三路离线语音通断器&#xff0c;输出无源。 感谢客户&#xff0c;让我们的产品…

【中国企业数字化转型之路】企业的资源投入与数字化转型的产出效益平衡探索(下篇:完结)

在数字化转型的浪潮中,企业面临着前所未有的挑战与机遇。这一转型过程不仅需要大量的技术、人才、管理和时间投入,更需要在投入与产出之间找到精准的平衡点,以确保转型的效益最大化。技术投入方面,企业需斥巨资引进云计算、大数据、人工智能等先进技术,构建高效智能的数字…

【算法设计与分析】实验——二维0-1背包问题(算法分析题:算法思路),独立任务最优调度问题(算法实现题:实验过程,描述,小结)

说明&#xff1a;博主是大学生&#xff0c;有一门课是算法设计与分析&#xff0c;这是博主记录课程实验报告的内容&#xff0c;题目是老师给的&#xff0c;其他内容和代码均为原创&#xff0c;可以参考学习&#xff0c;转载和搬运需评论吱声并注明出处哦。 要求&#xff1a;3-…

6月2日星期一今日早报简报微语报早读

6月2日星期一&#xff0c;农历五月初七&#xff0c;早报#微语早读。 1、郑钦文晋级法网女单八强&#xff0c;刷新生涯法网最佳战绩&#xff1b; 2、中国汽车报&#xff1a;“价格战”是一场无休止的恶性循环&#xff0c;深陷其中者必将皆输&#xff1b; 3、四川成都市崇州市…

启动metastore时报错MetaException(message:Version information not found in metastore

把hdfs清空重新安装了一下&#xff0c;hive的mysql元数据库删除掉之后重建之后一直启动报错 metastore.RetryingHMSHandler (RetryingHMSHandler.java:<init>(83)) - HMSHandler Fatal error: MetaException(message:Version information not found in metastore.) 后来…

一元函数积分

1. 不同名函数积分 2.三角函数有理式

spring-boot接入websocket教程以及常见问题解决

我们使用spring-boot接入websocket有三种方式&#xff1a;使用EnableWebSocket、EnableWebSocketMessageBroker以及ServerEndpoint&#xff0c;本文主要介绍使用ServerEndpoint方式的流程以及碰到的问题解决 接入方式 添加依赖 确保spring-boot-starter-websocket依赖 <d…

【音视频】 FFmpeg 解码H265

一、概述 实现了使用FFmpeg读取对应H265文件&#xff0c;并且保存为对应的yuv文件 二、实现流程 读取文件 将H265/H264文件放在build路径下&#xff0c;然后指定输出为yuv格式 在main函数中读取外部参数 if (argc < 2){fprintf(stderr, "Usage: %s <input file&…

URP - 水效果Shader

一、水面颜色 利用屏幕深度纹理和水体面片的深度差来设置水面颜色&#xff0c;形成水面的颜色渐变 float4 frag(Varyings i):SV_Target {//根据深度差设置水面颜色float2 ScreenUV i.positionCS.xy/_ScreenParams.xy; //屏幕UVfloat depthTex SAMPLE_TEXTURE2D(_CameraDe…

Spring之IOC

Spring 一、文档二、依赖注入方式三、注入其他类型3.1 设置null空值:使用null标签3.2 含特殊字符&#xff1a;使用CDATA 四、注入外部bean、内部bean4.1 注入属性中的外部bean4.2 注入属性中的内部bean4.3 注入属性级联赋值 五、注入集合属性5.1 注入集合属性5.2 把集合注入部分…

RAG的ETL Pipeline源码解读

原文链接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL源码解读 教程说明 说明&#xff1a;本教程将采用2025年5月20日正式的GA版&#xff0c;给出如下内容 核心功能模块的快速上手教程核心功能模块的源码级解读Spring ai alibaba增强的快速上手教程 源码级解读 版本&a…

github 2FA双重认证丢失解决

文章目录 前言一. 凭借ssh 解锁步骤1.1 要求输入设备码1.2.进入二重验证界面1.3.开始2FA恢复1.4.选择使用ssh验证 二.预防措施2.1 云盘上传git_recover_codes.txt2.2 开启多源FA认证2.2.1 大陆无法使用手机验证码 三.参考资料 前言 场景&#xff1a;没有意识到github recovery …