当前课程知识点:C语言程序设计(上) > 数据计算实现与顺序结构程序设计(二) > 2.3 逻辑运算的C程序实现 > 2.3.4 逻辑运算优先级
看完这个程序的运行
我们回头来讨论一下
关于逻辑运算的优先级
这么长的一个式子
这个优先级的问题
不解决好
这个式子的结果就是不可信的
我们拿这个式子来看
咱还把这个与的后边的这个判断
用不等于0这个式子来表达
那么这里边的优先级是怎么样
我们从头看
C永远都是从前往后做一件事
它碰到的第一件事情有没有障碍
没有障碍
它不管后边的谁的优先级高
谁的优先级低
都没有关系
只要不影响我此刻的运算
我此刻做的这运算是求余
求余下来是做一个关系比较
它两者是它的优先级高
那先做它不管后边
先做它
求下来的余数
和下一个去比较
下一个是关系运算符和逻辑运算符
谁的级别高
当然是关系运算符的优先级别高
所以在这块
第一步是先做求余
第二步做的是关系比较
前边两步做完了以后
我们大家看该做第三步了
第三步用遇到的运算符是与
与谁呢
与这个变量
这个变量的后边是求余
好了 与和求余这两个运算符
取运算级别高的
那后边的运算级别高
那前边的放下
先做后边的求余
求余完了以后是不是就可以与了
还要看
这个与和后边的下一个运算符
谁的级别高
那与和关系比较
关系比较高
所以下一个级别是做这个
做完以后
再看可以做与了吗
还是要看与和下一个运算符
谁的级别高
与和或相比
与的级别高
所以做与
剩下来
这前边已经得到了一个结果
我再做这个或
做不做这个或
这个是值得大家讨论的一个问题
在一般的计算机语言里边
是要把这个式子做完的
一直算到完
最后得到一个整个表达式的结果
但是我们说
咱开始在讨论C的时候
我们没有给大家
掰细了说这个C的优势都什么什么
但是
它其中有一个非常突出的优势
是它的运算效率高
运算效率高
其中
在它的表达式计算的优先级这块
是一个重要的因素
怎么讲
我们这个例子里边说
这个式子整个是
前半段和后半段做了或运算
这个或后边的运算要不要做
是取决于
前边的这个运算
得到的是真值还是假值
如果前边的运算已经得到了真值
对或而言
一个真两个真
结果都是真
那何必要算第二个真
也就是说对这个或运算而言
如果第一个
前边已经得到了一个真值
就决定了这个式子的结果是真值
那后边C就是能及时判断
我算到这已经
得到了这个表达式的结果
我后边就不再做了
所以提高了它的运算的效率
那什么情况下需要做后边
前边运算的结果为假为0
那我要看后边是不是为真
如果后边为真式子的结果仍然为真
因为这是或的功能
接下来关于优先级还来做一点讨论
我们把这个式子做一个变化
大家看一下我把或
本来在后边的式子搬到了前面
把前面这一长串放在了后边
我们看大家这个结果会怎么样
第一个
第一步当然算的是求余
因为后边是关系运算
第二步呢
算的是关系比较
这样的话只算了两步
我就可以得到这个结果
这个结果如果是1
那这个式子的后边整个就不要算了
所以在这个逻辑运算的优先级方面
还是写式子的时候就说
你这个程序就是一个优秀的程序员
它是会自觉不自觉的
把这块写在前边
如果前边得到了结果
后边就不用运算了
这样的话使得运算效率提高
这里边我们就非常关注它的优先级
对逻辑运算 我们刚才说了
它的运算级别是这样
与运算高于或运算
然后而非运算
是它一共只有这三个
与 或 非
大的原则是
单目运算符的级别高于
双目运算符
非是单目的
高于所有的双目运算符
不仅仅是高于逻辑运算
双目的逻辑运算
也高于双目的关系运算
也高于双目的算术运算
所以
它是在我们现在讲过的运算符里
这个逻辑非
是最高级的
就是优先级别最高级的运算符
而在双目运算符里边的优先级别是
算术优先
算术运算优先于关系
关系优先于逻辑
而各自在它们里边又有运算优先级
在这我们关于优先级
因为运算符很多
算术运算符有5个
关系运算符有6个
逻辑运算符有3个
十几个运算符搁在一起
它的优先级别就是要很讲究了
我们再看一个例子
这个例子里边我们是说给x赋值
这是一个赋值可不是一个关系比较
这个一定要不能搞混
这是给x赋值
赋的是什么值
赋的是这边的一个
逻辑运算表达式的值
x赋值是多少
我们先看一下
这里边我们刚才说了
它永远C都是从前边往后边算
走不动的时候是看它有没有冲突
现在碰到的第一个是括弧
谁的冲突都没有括弧优先
括弧里边a+b
是5+7是12
拿12去大于后边这个
后边这个也是先算
算出来一个结果才能做比较
c+d
是4+7
12大于7吗
Yes
这个运算的结果是1
1和谁去相与
与后边这个括弧的值
括弧的值是d大于a吗
d是3
3大于5吗 No
得到逻辑非0
那现在是两个
这个去与
是1与0
就真的与假的
x里边赋值的是假的
这个式子我们是想说什么
大家看这个是个与运算
同样是把式子截成了
前半段和后半段
那能不能说
我前半段已经只得到了1
我后半段就不算了
这个不能
不能的原因是
与运算的结果是
所有的运算对象
必须都是真的
与的结果才是真的
所以它要把
所有的运算对象都算完
相与的时候才能得到真
所以与的前边后边都要
依次的做运算才能获得结果
只有是或运算的时候
我们才可以说
根据前边的结果
决定后边的要不要运算
整个优先级是
单目的高于双目的
算术的高于关系的
关系的高于逻辑的
这块的x的值是0
关于逻辑运算问题
与C语言表达这个逻辑运算问题
我们做一个简单的小结
只有0才是假
-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