当前课程知识点:C/C++:从基础语法到优化策略 > Final Exam > Final exam > 3.3 Relational expressions (> < ==)
返回《C/C++:从基础语法到优化策略》慕课在线视频课程列表
我们这部分介绍一下关系表达式
表达式是什么呢 其实表达式就是一个值
或者说是一些值的组合
组合采用操作符把它们组合起来
比如说我们说2+3这就组成一个表达式
在我们的for循环里面
那么我们有三个表达式用来去控制这个for循环
那么我们在这主要是讲这个关系表达式
关系表达是有这么六种
六种操作符 分别是小于小于 等于等于和大于
大于等于以及不等于
大家注意 在这边需要特别注意就是关于
两个等于写在一起
那么是判断他是否相等 是否相等
就像前面判断他是否小于 那这是否相等
如果你只有一个等号 那就是赋值操作 赋值操作在这里
大家需要跟我们日常的对等号的理解区分开
那么在这里面呢 就关系表达式 本来是有很简单的东西
但是我们常犯的错误
初学者是等于和等于等于用错了
这是一个很常见的错误
在这呢 给大家看一个例子
程序名叫equal
那这个例子里面呢
在这个例子里面 我们来看
这个例子里面我们首先定义了一个数组
这个数组里面有十个元素 有十个元素
然后呢 我们写一个循环
循环是干嘛 i 等于零如果quizscores[i]等于20
那么i++
那就说如果他等于20就i++ 就会执行这个循环体就把i打印出来
那前面的这个二十二十都是20对不对
到19的时候 那他条件不成立 这个循环就结束了
也就说他会把前面20个分数前面
前面五个分数是20的分数打出来
这个是 但是这个这样的写法是稍微有点无厘头了
然后 这只是个例子来看
这个这个没啥问题 因为条件不成立就结束嘛就结束
这里面其实还是有一个隐患的 有一个隐患的
就说如果你i都是满足 如果有这个i他没有限制i的个数
有越界的隐患越界的隐患
那么如果你不小心把这个等号把这个是判断是否相能写成一个等号
那就变成什么了
首先 循环i等于零初始化 然后就看这个条件成不成立
这个条件永远成立 永远成立
那么这个条件就会怎么样
20等赋给quizscores 那么他这个整体
这个赋值操作 它还是一个表达式
也是一个表达式
它的值是多少 它的值就是20
所以说呢 这个task这个条件是一直成立的
那么你的i++那是不是就会变成死循环呀 死循环
我们先把这个注释掉
注释掉 我们先把前面那个打印一下
我们前面那个编译一下
运行
咱们来看这个 那么前面这五个值
前面这五个值都是20都打印出来了 没啥问题
那么 如果
后面这个不小心写成这个样子会怎么样 编译一下
他会警告 one warning generated
他说现在编译器很聪明 他说你这个地方不对吧
按说for循环里面你这个地方一般大家都是用等号等号 你怎么用个等号
他警告你说 你是不是用这个呀这是提醒
我用的这个编译器实际上是clang还是很聪明的 他的错误提示要更好
那他既然是个警告 你可以不理他嘛 对吧 他是个警告
那我们就只有编译还是成功了嘛
我们来看这里面呀
从零开始那就开始打印012345一直往上打印
刚才数组只有十个值是吧
而且每一个都被赋值了 还有他会带来的一个效
破坏信用的效应是他把这个数组里面的每个元素都赋20
所以说呢 你打印的时候
打印就是你这个数组变了 那我们i就是前面这个值在一直打印
因为后面这个值不是数组的值啊
他这个是个字符串的值
那就往后往后走 那所以说 在这个时候 他就一直在去赋值操作
赋值赋值一直赋 赋上去
如果越界了 这个数组只有十 越界了怎么办
他不管三七二十一就继续赋值 继续操作内存
去野蛮的去操作 那不会停止不会停止
然后一直往后操 也就是说他从这个数值往后面一直操作操作操作不会停下来
停了100多200多越界了很多了 也不停下来
直到突然间读到某一个地方
那个地方不允许他去写
可能是别的程序的地址或怎么别的
那么这个时候程序就崩掉了
抛出一个segmentationfort段错误
然后就告诉程序挂掉了
所以这种错误在大家用指针的时候会非常非常容易出现
这是C++编程的 就是难点
千万切记切记 很多时候数组的访问是不会检查的
千万不要越界 每次去做这些操作的时候 你就要不停的去想
i会不会越界 第i个元素会不会越界 有没有可能越界 你要去仔细去分析
所以说呢这个就是我们讲的要注意的时候注意的
还有我们需要注意的这个例子注意的例子
就是我们字符串的比较 字符串的比较
哪去了 字符串的比较比如说这儿
如果你要比较这两个字符串是不是相同
是相同注意用词 我说的是相同是指的内容相同
比如说他你希望他是个mate比如说你这定义一个字符串
有四个字符 问号第一个是 第二个是a t e
记住 四个字符 你要实验是五个 因为最后一个字符是
零他的他的值是零
所以说呢 在这他就说我们比较一下这个word
这个word是不是mate
如果不是 如果不是的话 它的返回值如果是
如果两个内容相同 那就返回零否则就是非零
也可能大于一可能小于一就按照字母顺序就字典顺序是由
string compare 他比出来的
那么相同就停下 不同 如果不同就怎么办
不同 就用ch把word的第零个字符换成ch
ch是从a开始++ ++那一直加到m 所以就停下来了
对吧 那么记住这是字符串的比较情形 这个不要采用等号
你采用等号的话 那就表示的是word的这个指针的
因为它这个数组 数组就是看成指针
这个指针也说这个地址是不是相同
所以他永远是false 所以记得要做字符串比较 是这个
时间关系 我们就不去运行它了
还有例如果是另外一个例子 另外一个例子里面
如果我们字符串的类型是string
string string的话是一个c++模板类里面定义字符串的类型
在这个时候 我们就可以采用等号了 第二个例子 我们看一下
这面其他都是一样的 不同的是这个地方
和string类型 string类型
string类型 它这个操作符不等于还有大于的 它都做了定义
做定义这个就是比较的实际上是
他这两个内容是不是相同啊
这个是运算符的重载 后面我们会专门来讲这个东西是什么
那这个地方的话 那我们可以这个运行一下吧
所以说 他从这问号开始 aate bate cate 一直到
late late之后然后再下一个是mate mate就相等
这个就不会打印了
然后呢 他就结束 之后就打印后面这个
所以说他是word is mate 是mate
-Quiz 1
-Quiz 2
-3.3 Relational expressions (> < ==)
-3.5 Branching statements (if else)
-3.8 break and continue statements
-Quiz 3
-4.4 Structures, Unions and Enumerations
-Quiz 4
-5.3 Allocate memory: C++ style
-Quiz 5
-6.3 Recursion and pointer to functions
-Quiz 6
-Quiz 7
-8.1 C/C++ with ARM development board
-Quiz 8
-9.2 Constructors and destructors
-Quiz 9
-10.1 Operators in cv::Mat in OpenCV
-10.4 Automatic conversions and type casts for classes
-Quiz 10
-11.1 Dynamic memory and classes
-11.2 New and improved String class
-11.3 Using pointers to objects
-Quiz 11
-12.2 Static and dynamic binding
-12.3 Access control: protected
-12.4 Inheritance and dynamic memory allocation
-Quiz 12
-13.1 Constructor and assignment
-13.2 Classes with object members
-Quiz 13
-14.1 CNN for image classification
-Quiz 14
-15.3 RTTI and type cast operators
-Quiz 15
-Final exam