内容正文:
2.7、2.8节:运算符及表达式(一)
C语言程序设计
电子工业出版社
掌握运算符基本概念与规则,理解表达式求值过程
熟练运用运算符编写表达式,培养代码调试与逻辑推理能力
培养严谨的编程思维与良好的编码习惯,提升专业兴趣
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:编程中的“加减乘除”
生活中的计算难题
假设你有100元钱,买了3本书(每本25元)和一支5元的笔。请问,你还剩下多少钱?
计算机如何理解?
虽然我们心算很容易,但想让计算机帮我们计算,就需要用它能理解的“语言”来描述过程。这就是我们今天要学习的核心——运算符和表达式。
教学导入:基本运算符
运算符的概念与分类
功能丰富:C语言提供了丰富的运算符集合,用于实现复杂的运算逻辑。
算术运算:我们常用的加、减、乘、除等操作都属于算术运算符,是编程的基础。
核心要素:理解运算符的优先级和结合性,是编写正确表达式的关键。
知识讲授
运算符及表达式
算术与自增自减运算符
位运算与赋值运算
第一部分
算术与自增自减运算符
知识讲授
知识讲授
知识讲授:算术运算符
+ 加法运算符
用于数值相加,也可作为正值运算符使用。
- 减法运算符
用于数值相减,也可作为负值运算符使用。
* 乘法运算符
用于计算两个数值的乘积。
/ 除法运算符
用于计算两个数值的商,注意整数除法会舍去小数部分。
% 求余运算符
也称模运算符,用于计算两个整数相除后的余数。
知识讲授:除法与取余的特殊规则
除法运算符 ( / )
当两个整数相除时,结果只保留整数部分,小数部分会被直接舍弃。
示例:
5 / 2 = 2 (整数除法,结果为整数,小数部分被舍弃)
7 / 3 = 2 (整数除法,结果为整数,小数部分被截断)
5.0 / 2 = 2.5 (浮点数除法,结果保留小数)
7 / 3.0 = 2.333... (浮点数除法,结果保留小数)
求余运算符 ( % )
计算两数相除的余数。注意:两侧操作数必须都是整型数据。
示例:
5 % 3 = 2
-7 % 2 = -1 (结果的符号与被除数相同)
2 % -7 = 2 (结果的符号与被除数相同)
// 错误用法:5.5 % 2 (包含浮点数)
知识讲授:算术表达式
基本定义
由算术运算符(如 +、-、*、/)和操作数组成的式子。操作数可以是常量、变量或另一个表达式。
关键规则
括号()可以改变运算的优先级,括号内的运算会优先进行,遵循“先乘除后加减,有括号先算括号里”的原则。
代码示例
2 + 3 * c
7 % 4 * a
(3 + 1)
2 + 3 * c / 7 % 4 * (3 + 1)
例题分析1
问题描述
已知变量定义:
int a = 10, b = 3;
解答与解析
计算结果:
a / b =3(整数除法,舍去小数部分)
a % b =1(取余数)
核心解析:
严格遵循整数除法和取余运算的规则,结果均为整数。
请计算以下表达式的值:
整数除法:a / b
取余运算:a % b
例题分析2
计算表达式:5 + 3 * 2 - 8 / 4
第一步:先算乘除
3 × 2 = 6
8 ÷ 4 = 2
第二步:再算加减
5 + 6 = 11
11 - 2 = 9
最终结果:9
关键规则:遵循“先乘除,后加减”的运算符优先级。
课堂问答
问题 1:表达式 7 / 2 的结果是多少?为什么?
答案:3,因为整数相除只保留整数部分,舍去小数。
问题 2:表达式 7 % 2 的结果是多少?它的作用是什么?
答案:1,这是求余运算(模运算),用于计算两数相除后的余数。
问题 3:如何用C语言表达式表示“a的平方加上b的平方”?
答案:a * a + b * b (注:C语言中通常使用乘法表示平方,而非 a**2)。
背诵记忆
基本算术运算符
C语言中基本的算术运算符包括:+、-、*、/、%
整数除法规则
两个整数相除,结果为整数,小数部分被舍弃。
取余运算符 (%)
取余运算符两侧的操作数必须都是整型数据。
运算优先级规则
算术表达式遵循“先乘除,后加减”的优先级规则。
课堂练习
编程任务要求
输入功能
从键盘输入两个整数,分别存入变量 num1 和 num2。
计算与输出
计算并输出它们的和、差、积、商和余数。
关键提示
输入输出函数
使用 scanf 进行输入,printf 进行格式化输出。
运算规则注意
注意整数除法(/)和取余(%)的规则,除数不能为零。
知识讲授:自增、自减运算符
自增运算符 (++)
作用:使变量的值加1,是一种简化的赋值操作。
示例:i++等价于i = i + 1
自减运算符 (- -)
作用:使变量的值减1,常用于循环结构中。
示例:j- -等价于j = j - 1
核心要点:这是C语言中非常独特且常用的运算符,本质上是对变量进行加1或减1的简化操作,在编写循环逻辑时非常高效。
知识讲授:自增自减中前置与后置的区别(难点)
知识讲授:自增自减中前置与后置的区别(难点)
知识讲授:自增自减中前置与后置的区别(难点)
前置运算 (++a, --a)
规则:先对变量进行自增/自减,再使用变量的值参与其他运算。
inta = 1, b;
b =++a;// a先变为2,再赋值给b
// 结果:a = 2, b = 2
后置运算 (a++, a--)
规则:先使用变量的当前值参与其他运算,运算结束后再对变量进行自增/自减。
inta = 1, b;
b =a++;
// a的当前值1先赋值给b,然后a变为2
// 结果:a = 2, b = 1
知识讲授:自增、自减表达式
基本定义
由自增、自减运算符(++、--)和操作数组成的式子,称为自增自减表达式。
示例:
count++
--index
重要注意事项
操作数限制:
自增、自减运算符的操作数只能是变量,不能是常量或表达式。
错误示例:
5++ (常量不可修改,不可自加)
(a + b)-- (表达式无存储单元,不可自加)
例题分析:前置与后置的区别
代码示例 (C语言)
inti=3, j;
j = i++;// 情况1:后置
printf("j=%d, i=%d", j, i);// 输出 j=3, i=4
i=3;
j = ++i;// 情况2:前置
printf("j=%d, i=%d", j, i);// 输出 j=4, i=4
情况 1:后置自增 (j = i++)
执行逻辑:先赋值,后自增。
第一步:将 i 的当前值 (3) 赋给 j
第二步:i 自增 1,变为 4
情况 2:前置自增 (j = ++i)
执行逻辑:先自增,后赋值。
第一步:i 先自增 1,变为 4
第二步:将 i 的新值 (4) 赋给 j
课堂问答
01. i++ 和 ++i 的本质区别是什么?
02. 在表达式 a = b++ 中,执行后a和b的值分别是如何变化的?
03. 为什么说自增自减运算符的操作数只能是变量?
答案: i++ 是“先用后加”, ++i 是“先加后用”。
答案:a 等于 b 的原值, b 的值增加1。
答案:因为它们需要修改操作数的值,而变量才有可写的内存空间。
背诵记忆
前置 ++/--:先变身,后工作
变量先完成加1或减1的“变身”,再参与其他运算“工作”。
后置 ++/--:先工作,后变身
变量先参与其他运算“工作”,运算结束后再完成加1或减1的“变身”。
重要规则:自增自减运算符的操作数只能是变量,不能是常量或表达式。
课堂练习
代码分析题
已知初始值:int x = 5;
1. 后置自增:y = x++ * 2;
思考:先运算还是先自增?计算后 x = ?, y = ?
2. 前置自增:y = ++x * 2;
思考:先运算还是先自增?计算后 x = ?, y = ?
编程实战任务
编写一个完整的程序,分别演示前置自增和后置自增的效果,并输出结果进行验证。
// 示例代码结构
intmain() {
inta = 5, b = 5;
inty1 = a++ * 2;// 后置
inty2 = ++b * 2;// 前置
// 输出结果...
}
第二部分
知识讲授
位运算与赋值运算
知识讲授
知识讲授:位运算基础概念
核心概念
位运算是直接对整数的二进制位进行操作的运算。它是计算机底层数据处理的基础,具有极高的执行效率。
五大运算符
本堂课将重点学习五种基本位运算符:按位与 (&)、按位或 (|)、按位异或 (^)、按位左移 (<<) 和按位右移 (>>)。
知识讲授:按位与 (&) 和按位或 (|)
按位与 (AND) &
运算规则:两个二进制位都为1时,结果为1;否则为0。
口诀:有0出0,全1出1
示例:计算 3 & 5
00000011 (3的二进制)
& 00000101 (5的二进制)
-----------
00000001 (结果为1)
按位或 (OR) |
运算规则:只要有一个二进制位为1,结果就为1;否则为0。
口诀:有1出1,全0出0
示例:计算 3 | 5
00000011 (3的二进制)
| 00000101 (5的二进制)
-----------
00000111 (结果为7)
知识讲授:按位异或 (^)
运算规则与示例
规则:两个二进制位相同为 0,不同为 1。
示例:计算 3 ^ 5
00000011 (3)
^ 00000101 (5)
-----------
00000110 (6)
核心特性
归零律 (a ^ a = 0)
任何数异或自身都等于 0,因为每一位都相同。
恒等律 (a ^ 0 = a)
任何数异或 0 都等于它本身,因为每一位都不变。
知识讲授:按位左移 (<<) 和右移 (>>)
按位左移 (Left Shift)
运算规则:左移丢弃高位,右侧补0
数学效果:等价于乘以 2 的 n 次方。
示例:3 << 1 (3左移1位)
00000011 (十进制 3)
<< 1
-----------
00000110 (结果为 6)
按位右移 (Right Shift)
运算规则:右移丢弃低位,左侧补符号位
数学效果:等价于除以 2 的 n 次方。
示例:6 >> 1 (6右移1位)
00000110 (十进制 6)
>> 1
-----------
00000011 (结果为 3)
例题分析
计算表达式:9 & 6 | 3 的值(注意:按位与优先级高于按位或)
步骤 1:计算 9 & 6 (按位与)
1001 (9)
& 0110 (6)
-------
0000 (结果为 0)
步骤 2:计算 0 | 3 (按位或)
0000 (0)
| 0011 (3)
-------
0011 (结果为 3)
最终结果:表达式 9 & 6 | 3 的值为3
课堂问答
01.按位与、按位或、按位异或的运算规则分别是什么?
答案:按位与(&):全1为1;按位或(|):有1为1;按位异或(^):不同为1。
01.按位左移一位和按位右移一位,在数学上通常分别等同于什么操作?
答案:左移一位 ≈ 乘以2;右移一位 ≈ 除以2(对于正数)。
01.位运算的操作对象是什么?(是十进制数还是二进制位?)
答案:操作对象是二进制位(bit)。
背诵记忆
运算符 名称 运算规则
& 按位与 有0出0,全1出1
| 按位或 有1出1,全0出0
^ 按位异或 相同为0,不同为1
<< 按位左移 左移n位,相当于乘以 2^n
>> 按位右移 右移n位,相当于除以 2^n(取整)
课堂练习
基础分析题
Q1. 位移运算
已知变量x=5(二进制为0101),执行x = x >> 1; 后,变量x的值是多少?
Q2. 位移运算分析
已知 int a = 7; 执行 a = a << 2; 后,变量 a 的值是多少?
编程实战
任务:二进制最低位检测
编写一个程序,输入一个整数,使用位运算判断它的二进制表示中最低位是否为1。
提示:
可以使用该整数和 1 进行按位与运算(&)来实现判断。
答案:2
答案:28
知识讲授:赋值运算符
知识讲授:赋值运算符
基本赋值运算符 (=)
核心作用
将一个表达式的值赋给一个变量,是程序中最基础的数据操作。
代码示例
int a = 2;// 将常量2赋给变量a
int b = 4 * 2;// 将表达式结果赋给变量b
关键区别:赋值 vs 数学等号
赋值运算符“=”表示一个操作,即将右边的值存入左边变量的内存空间,不等同于数学中的相等关系。
知识讲授:复合赋值运算符
定义与作用
定义:在赋值运算符“=”前加上其他二目运算符构成。
作用:简化代码书写,提高编译效率。
C语言中的复合赋值运算符
算术运算:+=, -=, *=, /=, %=
位运算:<<=, >>=, &=, ^=, |=
代码简化示例
简化写法:a += 5;
等价于:a = a + 5;
简化写法:b *= (4 + 3);
等价于:b = b * (4 + 3);
简化写法:x %= 10;
等价于:x = x % 10;
知识讲授:赋值表达式
知识讲授:赋值表达式
基本定义与形式
由赋值运算符和操作数组成的式子。一般形式为:
变量 赋值运算符 表达式
嵌套特性
赋值表达式可以嵌套,即一个赋值表达式可以作为另一个赋值表达式的操作数。
任何赋值表达式都有一个值,即被赋值变量的值。
代码示例解析
int a, b;
a = (b = 6);
执行过程与结果
第一步:先执行括号内的b = 6,将常量6赋给变量b。
第二步:将表达式b = 6的值(即6)赋给变量a。
最终结果:变量 a 和 b 的值均为 6。
例题分析
问题1:复合赋值运算
已知 int a = 2, b = 3; 执行 a *= b + 1; 后,a 的值是多少?
解析:复合赋值运算符优先级较低,等价于 a = a * (b + 1)。
计算过程:2 * (3 + 1) = 8。
结果:a = 8
问题2:嵌套赋值运算
已知 int x, y; 执行 x = (y = 5) + 3; 后,x 和 y 的值分别是多少?
解析:赋值表达式本身有值,即所赋的值。先执行 y = 5,再执行 x = 5 + 3。
结果:x = 8, y = 5
背诵记忆
基本赋值运算符
符号:=
作用:将右侧表达式的值赋给左侧变量。
示例:a = 10;
复合赋值运算符
形式:
+=, -=, *=, /=, %=
>>=、>>=、|=、^=、&=
作用:运算与赋值结合,简化代码。
示例:a+=5;等价于a=a+5;
赋值表达式特性
右结合性:连续赋值从右向左计算。
有返回值:表达式本身的值即被赋予的值。
示例:a=b=10;等价于a=(b=10);
课堂练习
01. 运算符改写
将下列语句用复合赋值运算符改写:
1. x = x % 10;
2. y = y - (z-2);
02. 连续赋值分析
分析表达式的执行顺序及结果:
a = b = c = 10;
03. 复合赋值嵌套
已知初始值:int m = 5;
执行 m -= m *= 2;
答案:
1. x %= 10;
2. y -= (z-2);
答案:
执行顺序:从右向左。
结果:a, b, c 均为 10。
结合性:右结合。
答案:
顺序:先执行 m *= 2 (m=10),再执行 m -= 10。
结果:m = 0。
课堂小结
第一堂课:基础运算
算术运算符
+、-、*、/、%,重点掌握整数除法和取余规则
自增自减运算符
++、--,难点在于前置“先变后用”与后置“先用后变”
第二堂课:进阶运算
位运算符
&、|、^、<<、>>,直接操作二进制位,效率极高
赋值运算符
= 及复合赋值 (+=, -=...),掌握赋值表达式的嵌套逻辑
核心思想总结
理解运算符的规则、优先级和结合性,是编写正确表达式的关键。请务必将这些知识点串联起来,形成完整的知识体系。
课堂小结
课后任务
基础题:数字反转
编写程序,输入一个三位数,将其各位数字反转后输出。
提示:使用除法和取余运算分解每一位数字。
提高题:位运算交换
利用位运算编写程序交换两个整数的值,要求不使用第三个临时变量。
提示:可以使用按位异或运算的特性。
思考题:运算符优先级
查阅资料,了解C语言中运算符的完整优先级和结合性表,并尝试分析复杂表达式的求值过程。
谢谢观看
THANKS
$