平时我们在说“如果……,那么……”的时候,还经常和“否则……”连用。比如:如果明天天气好,就开运动会,否则就不开。按照我们上一节学的内容,我们只能这样说:如果明天天气好,就开运动会;如果明天天气不好,就不开运动会。虽然这样也能够把意思表达清楚,但是语句显得冗长,要是条件再多一些则更是杂乱。可见,在程序设计中,如果没有“否则……”语句将会多么麻烦。
和平时说话的习惯一样,“否则”应该与“如果”连用,其语法格式为:
if (条件)
语句块1;
else
语句块2;
运行到该语句时,当条件满足,则运行语句块1中的语句;当条件不满足,则运行语句块2中的语句。我们也可以用流程图(图4.2.1)来直观地表示if……else……语句。和if语句一样,else语句的结尾是没有分号的。
我们来看一段程序:(程序4.2.1)
#include "iostream.h"
int main()
{
int a,b,max;
cout <<"请输入两个数:"<<endl;
cin >>a >>b;
if (a>=b)//如果a大于等于b,则把a的值放到max中
{
max=a;
}
else//否则把b的值放到max中
{
max=b;
}
cout <<"较大的数是" <<max <<endl;
return 0;
}
第一次运行结果:
请输入两个数:1 5
较大的数是5
第二次运行结果:
请输入两个数:5 8
较大的数是8
通过以上程序,我们基本上可以了解if……else……的使用了。
我们知道了,if语句的主要功能是给程序提供一个分支。然而,有时候程序中仅仅多一个分支是远远不够的,甚至有时候程序的分支会很复杂,要在一个分支里面再有一个分支。根据if语句的流程图,我们不难想象如果要在分支里再形成分支,就应该在if语句中使用if语句。这类在一种语句的内部多次使用这种语句的现象叫做嵌套。
我们来看一段程序,熟悉一下if的嵌套。(程序4.2.2)
#include "iostream.h"
int main()
{
float a,b;
char oper;//创建一个字符型变量用于存放操作符
cout <<"请输入一个表达式(eg.1+2):" <<endl;
cin >>a >>oper >>b;//输入表达式,操作符处于中间
if (oper=='+')//如果操作符是加号
{
cout <<a <<oper <<b <<'=' <<a+b <<endl;//输出两数的和
}
else//否则
{
if (oper=='-')//如果操作符是减号
{
cout <<a <<oper <<b <<'=' <<a-b <<endl;//输出两数的差
}
else//否则
{
if (oper=='*')//如果操作符是乘号
{
cout <<a <<oper <<b <<'=' <<a*b <<endl;//输出两数的积
}
else//否则
{
if (oper=='/' && b!=0)//如果操作符为除号且除数不为零
{
cout <<a <<oper <<b <<'=' <<a/b <<endl;//输入两数的商
}
else//否则
{
cout <<"出错啦!" <<endl;//操作符不正确或除数为零,输出错误信息
}
}
}
}
return 0;
}
第一次运行结果:
请输入一个表达式(eg.1+2):
1.5+3
1.5+3=4.5
第二次运行结果:
请输入一个表达式(eg.1+2):
8/0
出错啦!
第三次运行结果:
请输入一个表达式(eg.1+2):
5p3
出错啦!
以上这段程序能够基本实现表达式的识别。它所使用的if嵌套能够分辨出到底要进行什么运算,并且把引起错误的操作符或数据分支出来。
当一个程序中出现多个if……else……的时候,也可能会引来一些麻烦的事情。因为每个if都具有和else配对的功能。那么我们在阅读一段程序的时候,怎么才能够知道哪个if和哪个else是在一起的呢?
如果你尝试过在VC++中输入程序4.2.2,那么你一定会发现,每输入一次{},括号内部的语句就会自动向右侧缩进一段。而if……else……正是根据括号和缩进来判断它们是不是匹配的。具体的规则是,else向上寻找最近的一个和它处于相同缩进位置的if配对,我们把这种规则理解为“门当户对”。很显然,如果你没有改变过自动产生的缩进位置,else不会去找一个比它更右边或者更左边的if的。
在有些高级语言中,是没有缩进的。缩进不仅是为了美观,也是为了让程序的层次更加分明。我们通过缩进就能很容易看出一段代码应该从哪里开始,运行到哪里结束。如果没有缩进的话,就要去找保留字,这给大型程序开发带来了麻烦。所以保持缩进是一种好习惯。