当前课程知识点:C++语言程序设计基础 > 第2章 C++简单程序设计(一) > 运算与表达式 > 逗号运算、关系运算、逻辑运算和条件运算
逗号运算、关系运算、逻辑运算和条件运算
l 格式
表达式1,表达式2
l 求解顺序及结果
n 先求解表达式1,再求解表达式2
n 最终结果为表达式2的值
l 例
a = 3 * 5 , a * 4 最终结果为60
l 关系运算是比较简单的一种逻辑运算,优先次序为:
l 关系表达式是一种最简单的逻辑表达式
n 其结果类型为 bool,值只能为 true 或false。
例如:a > b,c <= a + b,x + y == 3
l 逻辑运算符
!(非) &&(与) ||(或)
优先次序: 高 → 低
l 逻辑运算结果类型:bool,值只能为 true 或false
l 逻辑表达式
例如:(a > b) && (x > y)
l “&&”的运算规则
n 两侧表达式都为真,结果为真;
n 有一侧表达式为假,结果为假。
l “&&” 的“短路特性”
表达式1 && 表达式2
n 先求解表达式1
n 若表达式1的值为false,则最终结果为false,不再求解表达式2
若表达式1的结果为true,则求解表达式2,以表达式2的结果作为最终结果
l “||”的运算规则
n 两侧表达式都为假,结果为假;
n 有一侧表达式为真,结果为真。
l “||” 的“短路特性”
表达式1 || 表达式2
n 先求解表达式1
n 若表达式1的值为true,则最终结果为true,不再求解表达式2
若表达式1的结果为false,则求解表达式2,以表达式2的结果作为最终结果
l 一般形式
n 表达式1?表达式2:表达式3
表达式1 必须是bool 类型
l 执行顺序
n 先求解表达式1,
n 若表达式1的值为true,则求解表达式2,表达式2的值为最终结果
若表达式1的值为false,则求解表达式3,表达式3的值为最终结果
l 条件运算符优先级高于赋值运算符,低于逻辑运算符
n 例
表达式1是bool类型,表达式2、3的类型可以不同,条件表达式的最终类型为2 和3 中较高的类型。
大家好
欢迎继续学习C++语言程序设计
这一节我给大家介绍几个
比较有趣的运算符
逗号运算符 关系运算符
逻辑运算符和条件运算符
那么逗号在C++中
也可以作为一个运算符的
它的作用
就是连接左右两个表达式
也就是先计算逗号运算符
左边的表达式
再计算逗号运算符右边的表达式
两个表达式都计算完了以后
以右边那个表达式
为最终表达式的结果
它的作用是什么呢
以后我们会在例子中看到
就像我们平常说话
一个比较长的句子
那么中间断一下
用个逗号 差不多的作用
那么关系运算符呢
是用来比较两个表达式
它们的大小相等
和不相等的关系的
那么逻辑运算符呢
是进行逻辑与 逻辑或
逻辑非运算的
还有条件表达式
条件表达式在C++中
可以用来实现一个
非常简单的选择结构
可以先问一下第一个表达式
是否为真呢
如果它为真 好
选择后面第二个表达式作为结果
如果为假
可以选择第三个表达式
作为最终的结果
这样用一个表达式就可以实现
我们后面要讲的
那种选择型结构了
所以今天这一节要给大家介绍的
这几个运算符
是非常有意思 也非常特殊的
下面我给大家详细介绍
这几个运算符的语法
现在我们来看一下逗号运算
它的语法形式是什么样的
这里我们看到
可以用逗号将两个表达式
连接起来
它的执行次序呢
是先求解表达式1
然后再求解表达式2
那么它整个算作一个表达式
这个表达式的最终结果
就是表达式2的值
比如我们看到这样一个例子
这里第一个表达式
它是3×5将值赋值给a
所以这是一个赋值表达式
赋值运算符的优先级
比逗号运算符的优先级要高
所以这是一个逗号
运算符连接起来的两个表达式
那么a得到了15个值以后呢
又去计算a×4
那么得到的结果是60
这个60就是整个逗号运算
表达式的结果
现在我们来看关系运算
与关系表达式
关系运算是用来比较
两个表达式它的大小
相等与不等关系的
我们看这里列出来的关系运算符
跟大家在数学中
熟悉的这个运算符是类似的
但是它的含义是不一样的
在数学中
我们写一个不等式的时候
表示是陈述这种不等关系
在程序中出现关系运算符的时候
表示需要进行比较运算
那么这里有小于 小于或等于
大于 大于或等于
还有等于 不等于
这样几个关系运算符
那么前面四个呢优先级相同
它们的优先级比较高
后两个等于和不等于
它们两个的优先级是相同的
而优先级相对比较低
实际上关系表达式呢
是一种最简单的逻辑表达式
它的结果值只能是为布尔类型的
是真或者是假
比如说我们看
这个几个关系表达式
这儿a大于b
那么它的值到底是真还是假呢
a大于b 它的值到底是真还是假
取决于在此之前
给a赋的值是什么
给b赋的值是什么
所以这要进行比较计算的
比如说如果a是1 b是2
那么a大于b 它的结果就是假
如果a是5 b是4
那么a大于b 它的结果就是真
所以像这几个表达式 a大于b
还有c小于等于a+b
还有x+y等于3
都是表示它们要进行比较运算
根据比较运算符
两侧表达式的值
得出最后比较的结果是真还是假
在C++中呢 还有逻辑运算符
仅仅只有简单的关系比较
是不足以表示复杂的逻辑关系的
比如说我们先看这个例子
可能你需要判断一下
是否a大于b 并且x大于y
那这样你简单只用关系运算符
就不够了
这个时候我们还有一个并且关系
要在程序中表示
那这样就要用与运算符
逻辑“与”
所以逻辑运算符呢
包括非与或三个
非的优先级最高 其次是与
优先级最低的是或
逻辑运算符它的运算结果
也是布尔类型的
只能为真 或者为假
那么这个逻辑与呢
它是具有短路特性的
短路特性是什么意思呢
我们首先要知道
逻辑与它的运算规则是什么
逻辑与的运算规则是
当两边的表达式都为真的时候
它才最终的结果是真
如果与运算符两边的表达式
有任意一个是假
那整个结果肯定是假
所以这个短路特性就是说
首先判断左边的表达式
如果说左边的表达式已经是假了
那右边的表达式就不用计算了
直接得出结论
这个与运算的结果为假
或运算呢也有类似的特性
首先它要计算左边的表达式
如果左边的表达式为真
整个表达式都为真了
为什么呢
因为或运算它的运算规则是
运算符两端的表达式如果都为假
那么结果才为假
在或运算两侧的表达式
只要有一个为真
最终的结果就是真
所以它会先计算
或运算左边的表达式
如果发现已经是真
那右边的表达式就不会再计算了
直接得出结论真
所以由于这样短路特性
当我们作与或者或运算的时候
第二个表达式
也就是运算符右边的表达式
很有可能是不计算的
在C++中
还有一个非常有意思的表达式
叫做条件表达式
条件表达式呢
它其中有三个部分
我们来看一下它的语法
第一个部分表达式1
后面有个问号
那么表达式1必须是布尔类型的
也就是它只能取值为真或者是假
第二个表达式后面有个冒号
然后是第三个表达式
它运算的时候的求解次序呢
是先求解表达式1
如果表达式1的值为真
那么就继续求解表达式2
以表达式2的结果
为整个表达式的结果
如果表达式1的结果为假
那么就越过表达式2不求解了
直接就求解表达式3
以表达式3的结果
为整个表达式的结果
我们来看这样一个例子
第一个表达式是a大于b 问号
那么也就是判断一下
a大于b是否成立
它的结果为真还是为假
如果a大于b的结果是真
那么就计算第二个表达式a
因a的值
作为整个条件运算的结果
赋值给x
如果a大于b的结果是假
那么就计算第三个表达式
也就是b
将b的值
作为整个条件运算的结果
赋值给x
那么大家看看
这个是不是起到了
一个简单的选择结构的作用呢
先判断a和b谁比较大
然后把两者比较大的那个选出来
赋给x
在后续我们要学习依附语句
学了依附语句以后
大家就会发现
实际上这个条件运算符
和条件表达式
就解决了一个最简单的选择结构
也就是把最简单的依附语句
这样简化了
这是C++语言的特色语句之一
那么大家使用
这个条件运算符的时候呢
要注意这个运算优先级
条件运算符优先级
高于赋值运算符
低于逻辑运算符
那么在这里面会有三个表达式
那么第一个表达式
必须是布尔类型的
表达式2和表达式3
类型可以是不同的
那么这个条件表达式
最终的类型是什么呢
不管这个条件表达式最终的取值是第二个表达式的值
还是第三个表达式的值
那么它最终的类型
都是表达式2
和表达式3中较高的类型
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)