一个 if 或 if-else 语句可以放在另一个 if 或 if-else 语句中,这种结构称为嵌套 if,它允许测试多个条件来确定究竟应该执行哪个代码块。
例如,有这么一个银行程序,需要确定银行客户是否有资格获得特别低利率的贷款。要符合资格,必须存在以下两个条件:
图 1 显示了可用于此类程序的算法的流程图。
如果在图 1 中遵循执行流程,则可以看到第一个被测试的表达式为 employed = 'Y'。如果此表达式为 false,说明客户没有工作,则不需要执行任何其他测试,因为已经知道客户不符合特殊利率资格了,于是显示"You must be employed to qualify."(您必须有工作才能获得资格)。
但是,如果表达式为 true,则还需要测试第二个条件,也就是通过一个嵌套的决策结构来测试表达式 recentGrad = 'Y'。如果第二个表达式为 false,则客户仍不符合条件。 于是显示"You must have graduated from college in the past two years to qualify."(您必须在过去两年内刚从大学毕业才能获得资格);如果第二个表达式为 true,则客户有资格获得特别低利率的贷款,显示结果为"You qualify for the special interest rate."(您有资格获得特别低利率贷款)。
下面的程序显示了与流程图的逻辑对应的代码。它在一个 if-else 语句中嵌套了另外一个 if-else 语句。
//This program determines whether a loan applicant qualifies for
//a special loan interest rate. It uses nested if-else statements.
#include <iostream>
using namespace std;
int main()
{
char employed,recentGrad;
cout << "Are you employed?(Y/N) ";
cin >> employed;
cout << "Have you graduated from college in the past two years?(Y/N) ";
cin >> recentGrad;
//Determine the applicant1s loan qualifications
if (employed == 'Y')
{
if (recentGrad == 'Y') // Employed and a recent grad
{
cout << "You qualify for the special interest rate.\n";
}
else // Employed but not a recent grad
{
cout << "You must have graduated from college in the past two years to qualify for the special interest rate.\n";
}
}
else // Not employed
{
cout << "You must be employed to qualify for the "<<"special interest rate. \n";
}
return 0;
}
程序运行结果:
仔细研究一下该程序。从第14 行开始的 if 语句测试了表达式 employed == 'Y'。如果该表达式为 true,则执行从第 16 行开始的内部if语句。但是,如果该表达式的值为 false,则程序跳转到第 25 行,执行外部 else 块中的语句。
在调试使用嵌套 if-else 语句的程序时,重要的是要知道哪个 if 语句与 else 语句一起使用。正确匹配每个 else 与 if 的规则是这样的:一个 else 匹配与其最近的上一个 if 语句,并且该 if 语句没有自己的 else。当语句正确缩进时,这更容易看出来。
图 2 显示了类似于此程序第 14〜28 行的代码。它说明了每个 else 如何找到匹配的 if。这些视觉线索很重要,因为嵌套 if 语句可能非常长而复杂。