当前课程知识点:C语言程序设计(上) > 数据计算实现与顺序结构程序设计(二) > 2.3 逻辑运算的C程序实现 > 2.3.5 条件运算符
大家好 我们今天来讨论两件事
什么是条件运算符
在这个运算符号里边 有两个字符
问号 冒号
那自然构成了 三目运算符
这是一个三目运算
哪三目
条件 表达式1 表达式2
那它表达的意思是说什么呢
这个运算的开始
我先判断条件是否正确
就是判断条件是否为真 不是是否正确
那么也就是说 我们举个例子看
我从a和b里边找一个大数
如果a大于b 我们就把a赋值给x
否则 我就把b赋值给x
那大家看 假如说
我把a里边是9 b里边是5
那这时候x里边是什么呢
那一定是说
条件满足的时候是9大于5的
那么这时候我们一定是
x里边获得的是a里边的内容 是9
那么在这个条件运算符里
要说明的一点是什么呢
不是表达式一的结果就是表达式二的结果
我们下边看一个例子
那么对这问题我们怎么考虑呢
最简单的就是这个
条件运算符
一个运算符就解决了这里边的问题
程序是不是可以这样写
我们来把这个程序运行一下看看
这个条件运算符
出现在刚才应该是在这块地方
我们看见的那个程序
那在这个程序里边呢
我们看两个变量
大家现在对这个scanf 看到有
scanf 这是从键盘上获取数据的
那在这里边 我们一定是会有一对引号的
然后引号里边 我们取一个整型的数
这就一定要取这个
一个取d值 然后age
大家 不要忘了这里边的分号
那么下来这个运算 是给谁赋值呢
money是多少呢
我们刚才说了 一个条件表达式
就能够完成
那么条件表达式里边的是谁
以谁来判断呢 age
你的age是大于12吗
如果是的话
你就给我 把80送给money
否则这里边是 冒号隔开
把20送过去
大家看 一定不要忘了
分号 这个程序完成了
我们运行一下看
好 我们现在试一下
输入一个 8岁的小孩
说你的票价是20
回过头来 我们再
刚才走的是这条道
age 8大于12吗
不是的啊 20
我们运行一下 给一个边界
输入的就是12岁
我们看 满足了什么呢
你大于12吗 没有啊
同样还是按照小孩的年龄
那么 我们给一个65岁
我们票价80
回过头来 大家看一下这里边
这是条件运算符构成的一个条件表达式
来完成的这件事
这是我们刚才看到的程序
那现在对于这个条件运算符
大家一定会还有一个疑问是说
它的优先级 这个运算符的优先级呢
因为它是唯一的一个三目运算符
这个运算符的优先级
仅仅比赋值运算符的优先级高一级
赋值运算符我们大家知道
在C里边 是所有运算符里
级别最低的 那它就是倒数第二了
下来咱们讨论结合性
计算结合性
那说到结合性这个是
好像给大家不容易理解的一个词
其实它是一个什么呢 计算方向
那我说这个
其实大家也不一定能够很好的理解
结合性呢我们这么说
就是说当你遇到了
若干个运算符 它的优先级是相同的时候
比如说加减 比如说乘除
比如说关系运算里边
同一个级别上的这些运算符
遇到一起的时候
那么它先从哪个方向上计算
先算哪个
先算前面比如说加和减
我先算后边的减呢还是先算前面的加呢
从前面往后算叫左结合
从左到右算
从右到左算是右结合
那是我强调这句话
多个同一个级别的
优先级相同的情况下
这些运算 放在一起的时候
先算哪一个运算
先从哪个方向上算
这叫我们的结合性
比如说 大家看一下下面这个
第一个我们说 a+b-c
那加和减这两个操作 是同一个 运算优先级
那么先算减还是先算加
我们刚才让左结合 先算加 再计算减
这是 左结合
那我们这样 这箭头表达的是
从左向右算
那下一个 a+b*c
那这时候 大家脑子里一下就出了
那当然先算c了
那这是谁决定的
是结合性决定的 还是优先级决定的
优先级
那是b先乘以c
这是因为乘的优先级比较高
所以呢 我们这里边遵循的还是什么呢
无论是对加还是乘 它的结合性还是左结合
那为什么我们会先算后边的乘呢
是因为它的级 优先级高
所以在这块 大家一定要注意
结合性和优先级 是两个不同的概念
结合性强调的是
相同优先级的运算符放在一起的时候
你到底先算前边的呢 还是先算后边的
那我们再来看这个
复合运算 那这其实是两个运算
那这两个运算
你先赋值再加 还是先加再赋值
这块 我们是右结合
那右结合就是说
你先对你这x进行操作
先算y加上x 再赋值给y
那么 这块是右结合
先对x施加你的运算操作
那下面这个呢 i+++j
这很重要
但是它的重要 并不是决定于它的结合性
而是它的优先级
也就说我们把谁算成自增
把谁算成是加法运算
那这里边 我们说
优先级决定了 它计算的顺序
那是加加自增的优先级高
这一块切割的方法是
i++ 加上j
所以呢 先关注的是i++
然后再加上j
所以他这个呢 是只关注的加法的结合性
是左结合的 加法的结合性
那下边就不同了 我们看
下边是两个赋值
相同的运算符遇到了一起
那我们使 右结合
这赋值运算是右结合
把b送给a 把a再送给y
而不是说 我先算第一个赋值
把a送给y 再把b送给a
这结果完全就不同了
所以我们在这里边现在强调的是说
相同优先级的运算符
碰到一起的时候
你的结合性就是至关重要的
比如说这个是左结合
而这个呢 也是左结合
但是它的优先级别高
这不是相同级别的
相同优先级的运算符遇到了一起
那是优先级决定了它的运算的先后顺序
而后边这个也是右结合
在这一块呢 我们一定要注意结合性
它解决的是我们说的这句话
几个操作符的优先级
相同的时候 先执行哪个方向上的运算
那我们这一块呢
关于结合性
我们在学习资料里边
给大家提供了课上每一个教材上
基本上都有一个列表
我从这个列表上 掐出来一点点
大家看一下 这里边
我们看咱今天说的
条件运算符它的结合性是什么呢
右结合 先算右边
那这怎么体现呢
我这里边还有一个 复合运算符
也是先算右边
比如说 条件运算符
怎么叫先算右边呢
我这个问号 冒号 这是一组
那再一个问号冒号这是第二组
那它的结合性 右结合
一定是先算后边的
再算前边的 这个绿颜色的线
这才是它的一个运算的结合性
比如说我们还把这个自动购票的这个问题
咱们再把它稍微的加一点功能
小于12岁的小孩 20块钱
大于70岁的老人免票
12到69之间咱是80块钱
我们把这个程序改一下大家看看
那关键的这句话 是不是应该是这样子
就说money 里边应该是什么呢
我们第一个判断是 是小孩吗
但是后边又有一个问号冒号
那现在怎么做呢
因为是小孩吗 是或者不是
我们都要取它冒号后边的东西
那我们结合性
这里没有优先级的问题
是两个相同级别 优先级别的运算符
放在了一起
那我们先看的是后边的
因为它是右结合 我们先看后边
是老人吗 如果是 免票
否则我们这个
条件表达式的结果是80
把这个程序运行一下看看
我们把刚才的这个
三个段 把年龄截成三个段这件事
表达在这里边的话 我们先看
刚才我们说的 这已经变化了
是小孩吗 小于12吗
如果是还是不是 问号后边 是说
如果是小于12 你给20
否则 没完
还要判断
那么我们后边再来说
你这age 你是大于69吗
如果是的话 你是免票的
否则 你才是80
大家看 这块是这样
这是我们说的 后边的这个表达式
这是问号和冒号 是前边这组的表达式
我们运行一下这个结果看一下
我们先给一个8岁的小孩
说20 没有问题
我们再运行一下看看
我们给一个 75岁的老人
好了 免票的
那大家看
如果我这两者都不是
我是给了45岁的一个先生
80 没有问题
这块顺便给大家说一下
我们现在已经编写程序了
编写程序的时候 你怎么测试你的程序呢
做这个测试的时候
是找边界 比如说12 70
你到底70岁是免票 还是不免票
是在于你这写的是什么
如果我们把它写成说大于70
那70就是不免票的
所以呢 这种情况
大家 要在你的程序运行完做测试
比如说 我现在把这一句话
拿到咱们的这里边
我就可以 把这个问号去掉了
把这个放在这
那么这个程序里边 大家看
你的边界条件就是什么呢
实际上就成了
12岁 也是20
而70岁 却不是免票
71岁才免票
那你想把70岁变成免票
刚才使我们写69
或者说写大于等于这样子
边界条件非常重要
那么你的程序
不是说小心翼翼给一个正确的输入
得到一个正确的结果
而是说我给任何输入
我都能够得到一个正确结果
或者 一个正确的提示
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html