if语句详解

对于可能发生的事情,我们平时经常会说“如果……,那么……”。语文里,我们叫它条件复句。“如果”之后的内容我们称为条件,当条件满足时,就会发生“那么”之后的事件。我们来看这样一句英语:If mark>99, cout <<”Perfect!” <<endl.把它翻译成中文就是:如果分数大于99,则输出Perfect。

其实在程序设计中,也是用“如果”来描述可能发生的情况的。它和刚才的那句英语很相似,具体的语法格式是:

if(条件){语句1;语句2;...
}

我们把若干句语句放在一个大括号中,称为语句块。运行到该if语句,当条件满足时,就会执行语句块内的内容。我们也可以用流程图(图4.1.1)来表示if语句。请注意,if语句的结束是没有分号的,分号只是属于语句块中的语句。

一、条件——关系运算
当我们判断一个条件的时候,依赖于这个条件是真是假。说到真和假,我们不难想到布尔型数据(参见3.1),因为它就是分别用0和1来表示真和假。显然条件的位置上应该放置一个布尔型的数据。然而,光靠死板的0和1两个数仍然无法描述可能发生着变化的各种情况。那么我们如何让电脑来根据实际情况做出判断呢?

这里我们要引入关系运算。之前的加减乘除和取余数之类的操作,结果都是整型或实型数据。而关系运算的结果则是布尔型数据,也就是说它们的结果只有两种——真或假。

所谓关系运算,是判断操作符两边数据的关系。这些关系一共有六种,分别是:等于、大于、小于、大于等于、小于等于、不等于。如下表所示:

当操作符两边的数据符合操作符对应的关系时,运算结果为真,否则为假。比如5>1的结果是1(真),’a’==’a’的结果也是1(真);而3<=2的结果为0(假)等等。特别要注意,==和=是两个不同的操作符,前者是判断操作符两边数据的关系,后者是把右面的表达式的结果赋值给左边。

下面我们来看一段程序:

#include<bits/stdc++.h>
using namespace std;
int main(){int a,b;cout<<"请输入两个数:";cin>>a>>b;if(a>b){//如果a比b大,则将两个数交换swap(a,b);}cout<<a<<" "<<b<<endl;//将两个数从小到大输出return 0;
}

第一次运行结果:
请输入两个数:1 5
1 5
第二次运行结果:
请输入两个数:3 2
2 3

算法时间:交换
交换是程序设计中最基础最常用的一种操作。它的算法在现实生活中也有着形象的操作。交换两个变量里的数据就好像交换AB两个碗中的水。我们必须再拿一个碗来(临时变量),将A碗里面的水先倒到这个临时的碗里,再将B碗的水倒到空的A碗里,最后把临时碗里的水再倒回B碗,那么就完成了这个工作。对照着这个过程去阅读代码是不是有些理解了呢?至于这个算法的代码,也是非常好记的。记住把临时变量放在首位,然后把任一变量放在等号的右边,下一句语句开头的必然也是这个变量。简单地记就是首尾相连。这个程序完成的工作是将两个无序的整数从小到大地输出。即如果第一个数比第二个数大,先交换再输出,否则直接输出。

二、条件——逻辑运算
学校评三好学生,候选人必须要德智体全面发展才能够评上;学校开运动会,运动员只要在某一个项目上是全校第一就能够获得冠军。现实生活中,有些条件会很严格,要数项同时满足时才算符合条件;而有些条件又会很松,只要符合其中某一项就算符合条件了。在程序设计中,我们也会遇到这样的问题。

平时,我们往往是用“并且”和“或”两个词来描述这些情况的。而在程序设计中,我们用逻辑运算来描述。我们平时称它们“与”(相当于并且)、“或”、“非”。“逻辑与”的操作符是&&,“逻辑或”的操作符是||,“非”的操作符是!。下面三个真值表说明了各逻辑运算的结果。

上面两表的第一行和第一列分别是逻辑操作符两侧的值,右下角带有灰色底纹的四格是经过运算后的结果。

如果我们用集合A和集合B分别来描述两个不相同的条件A和B,那么A&&B表示要满足集合A与集合B的交集;A||B表示要满足集合A与集合B的并集;!A表示要满足集合A的补集。

在程序设计中,我们把这种运算的次序称作操作符(Operator)的优先级。那么,关系操作符和逻辑操作符的优先级是怎么样的呢?

和简单表达式一样,括号的优先级仍然是最高的。无论什么情况都应该先从左到右地计算括号内的结果。当算术操作符、关系操作符和逻辑操作符处于同一级的括号中时,则分别从左向右地依次进行逻辑非运算、算术运算(遵循算术运算的优先级)、关系运算、逻辑与运算和逻辑或运算。(记作“不算关羽活”)。

下面我们来实践一下,看一段程序:

#include<iostream.h>
int main(){int mark;cout<<"请输入成绩(0~100):";cin>>mark;if(mark>=80&&mark<=100) cout<<"Good!"<<endl;if(mark>=60&&mark<80) cout<<"So so"<<endl;if(mark>=0&&mark<60) cout<<"Please work harder!"<<endl;if(mark<0||mark>100) cout<<"ERROR!"<<endl;return 0;
}

第一次运行结果:
请输入成绩(0~100):100
Good!
第二次运行结果:
请输入成绩(0~100):75
So so
第三次运行结果:
请输入成绩(0~100):59
Please work harder!
第四次运行结果:
请输入成绩(0~100):105
ERROR!

我们可以看到,将关系运算和逻辑运算配合使用,可以将数值有效地分段。以上这段程序的功能就是按照不同段的数值输出不同的结果,如果输入的数值超出正常的取值范围,则输出出错信息。

算法时间:纠错
熟悉电脑软件的同学都知道,不少软件或程序有时候会有漏洞(Bug),使得程序的安全性或稳定性受到影响。而产生这些漏洞的部分原因就是程序员在设计程序时有所疏漏,忘记了去考虑一些可能引起错误的特殊情况。我们把这些可能引起程序异常的情况称为临界情况。比如在a/b中,b=0就是一种临界情况。如果不考虑到这种情况,则可能导致除数为零而使整个程序崩溃。我们学会了if语句以后就能够从一定程度上避免一些可以预知的错误,把那些临界情况引入纠错程序。(比如输出出错信息,或及时中止程序)

三、&&和||的妙用
有时候我们做数学题目会遇到这样的问题——(1+58)/60/(5/6+2),当我们发现整个式子是乘式,并且有一个乘数为0的时候,则会不再做更多的计算,把结果脱口而出。因为无论后面的乘数是什么,都无法改变结果了。

根据真值表我们知道,在逻辑与中,只要有一个假则整个表达式的结果为假;在逻辑或中,只要有一个是真则整个表达式的结果为真。我们发现逻辑与、逻辑或和上面所说的例子有着相似之处,那么电脑会不会像我们一样,不再做更多无所谓的计算呢?

答案是肯定的。即在一个或多个连续的逻辑与中,一旦出现一个假,则结果为假,处于该位置以后的条件不再做更多判断;在一个或多个连续的逻辑或中,一旦出现一个真,则结果为真,处于该位置以后的条件也不再做更多判断。
比如:

 if (m!=0 && n/m<1)
{cout <<”OK” <<endl;
}

当m=0时,电脑不会去尝试用n/m了,而是直接跳过整句语句。这样,我们就能够避免除数为零的错误了。

C++-10种控制语句详解(第一种-if)相关推荐

  1. [redis] 10 种数据结构详解

    [redis] 10 种数据结构详解 简介 5种常见数据结构 string: 最常见的 string key value list: 双向链表 set: 集合- zset: 有序集合 hash: 类似 ...

  2. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。

    本文脑图 前言 Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. 关于Redis的文章之前也写过三篇,阅读量和读者的反映都还 ...

  3. kinux查日志_Linux实时查看日志的四种命令详解

    原标题:Linux实时查看日志的四种命令详解 如何在Linux中实时查看日志文件的内容?那么有很多实用程序可以帮助用户在文件更改或不断更新时输出文件的内容.在Linux中实时显示文件内容的常用命令是t ...

  4. 查看登陆系统用户的信息的三种方法详解

    查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [O ...

  5. FTP协议主动(Port)模式和被动(Passive)两种模式详解

    FTP协议主动(Port)模式和被动(Passive)两种模式详解 FTP(File Transfer Protocol)是文件传输协议的简称. 正如其名所示: FTP的主要作用,就是让用户连接上一个 ...

  6. 详解23种设计模式(基于Java)—— 结构型模式(三 / 五)

    目录 3.结构型模式(7种) 3.1.代理模式 3.1.1.概述 3.1.2.结构 3.1.3.静态代理 3.1.4.JDK动态代理 3.1.5.CGLIB动态代理 3.1.6.三种代理的对比 3.1 ...

  7. RTSP、HTTP、HTTPS、SDP四种协议详解

    RTSP.HTTP.HTTPS.SDP四种协议详解 从这篇开始我们将进入流媒体的环节,流媒体在android中有nuplayer来实现的,在开始讲解android流媒体前,我们先来讲讲流媒体传输协议, ...

  8. 新浪微博怎么推广引流,微博推广引流的三种方法详解

    新浪微博怎么推广引流,微博推广引流的三种方法详解,#推广#营销 微博营销有哪些特点?#百收网SEO@千行助推 大家好,上一次内容讲了生意人如何将客户引流到自己的微信上去,受到很多朋友的喜爱,那么这一期 ...

  9. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 阅读本文前,请确保你已经掌握了递归.栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作. 深度优先遍 ...

最新文章

  1. html中右侧三角形代码,html – 使用CSS边框的三角形和倒三角形
  2. 知识体系地图模型:你是如何有效地学习?
  3. python怎么用matplotlib_Python Matplotlib 绘图使用指南 (附代码)
  4. head.s 分析——Linux-0.11 学习笔记(三)
  5. 【Java】eclipse如何设置成保护眼的背景色
  6. IBASE save error
  7. 主成分分析法_探索主成分分析法
  8. 【中生代技术】1024程序员节快跑,提需求的来了
  9. django解决借用Model使用数据库时报错 AttributeError: Manager isn‘t accessible via xxxxxModel instances
  10. Windows 7 God Mode
  11. Infinity 插件设置
  12. javaScript中的垃圾回收机制
  13. VC及esxi升级的必要性和步骤
  14. 测试工程师需要具备的能力
  15. Google谷歌未来如何占领“Web3高地”?
  16. python找出列表里大于输出_python找出列表中大于某个阈值的数据段示例
  17. 面试中的老大难 - MySQL中的锁
  18. Win7完全卸载MySQL的步骤
  19. python小象学院: BMR------ 基础代谢率1.0
  20. 基于VUE+SSM框架的公司公文管理系统(毕业设计+论文)

热门文章

  1. java图形界面设计——求三角形的面积
  2. SpringBoot中yml文件失效
  3. 自定义elementUI皮肤、色系、主题、主色调
  4. 整理了142道Linux面试题【附答案】
  5. stable-diffusion-webui 本地部署git报错问题解决
  6. springboot+mysql+基于Java的学生请销假审批管理系统的设计与实现 毕业设计-附源码130939
  7. java访问静态方法_JAVA:正确访问静态方法
  8. Linux下安装配置启动redis
  9. 智能手表遭遇“幽灵堵车”,华为、华米、苹果谁能争第一
  10. android GridView 在TV上,上下翻页的时候平滑滑动的实现