首页 > 编程 > C++ > 正文

C++教程:C++ if语句讲解

2020-05-23 14:28:30
字体:
来源:转载
供稿:网友
对于可能发生的事情,我们平时经常会说“如果……,那么……”。语文里,我们叫它条件复句。“如果”之后的内容我们称为条件,当条件满足时,就会发生“那么”之后的事件。我们来看这样一句英语:If mark>90, cout <<”GOOD!” <<endl.把它翻译成中文就是:如果分数大于90,则输出GOOD。

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

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

一、条件——关系运算

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

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

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

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

下面我们来看一段程序:(程序4.1.1)
#include "iostream.h"
int main()
{
   int a,b;
   cout <<"请输入两个数:";
   cin >>a >>b;
   if (a>b)//如果a比b大,则将两个数交换
   {
      int temp;//创建一个临时变量
      temp=a;
      a=b;
      b=temp;
   }
   cout <<a <<" " <<b <<endl;//将两个数从小到大输出
   return 0;
}
第一次运行结果:
请输入两个数:1 5
1 5
第二次运行结果:
请输入两个数:3 2
2 3

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

二、条件——逻辑运算

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

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

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

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

在上一章的3.3简单表达式中,我们提到了运算的次序。在程序设计中,我们把这种运算的次序称作操作符(Operator)的优先级。那么,关系操作符和逻辑操作符的优先级是怎么样的呢?

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

下面我们来实践一下,看一段程序:(程序4.1.2)
#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+5*8)/6*0/(5/6+2),当我们发现整个式子是乘式,并且有一个乘数为0的时候,则会不再做更多的计算,把结果脱口而出。因为无论后面的乘数是什么,都无法改变结果了。

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

答案是肯定的。即在一个或多个连续的逻辑与中,一旦出现一个假,则结果为假,处于该位置以后的条件不再做更多判断;在一个或多个连续的逻辑或中,一旦出现一个真,则结果为真,处于该位置以后的条件也不再做更多判断。
比如: if (m!=0 && n/m<1)
{
cout <<”OK” <<endl;
}
当m=0时,电脑不会去尝试用n/m了,而是直接跳过整句语句。这样,我们就能够避免除数为零的错误了。 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表