### if 语句

if 语句用于根据表达式（通常为关系表达式）的值有选择的执行语句，最简单的语法格式是：

if (表达式)

语句；

例如，“如果今天不下雨，我们就去放风筝”。在程序中可以使用下面的 if 语句来描述。

简单 if 语句

//定义一个表示天气的枚举类型

typedef enum Weather{WH_RAIN = 0, WH_SUN = 1, WH_WIND = 2, SH_SNOW = 3};

int main(int argc, char* argv[])

{

Weather today = WH_SUN; //定义一个变量 today 表示今天的天气

if (today != WH_RAIN) //如果天气不等于雨

{

cout << "我们去放风筝" << endl; //输出信息

}

return 0;

}

在许多问题的逻辑关系中，经常会出现依据一个条件是否成立导致两种不同的结果。例如，“如果今天不下雨，我们就去放风筝，否则我们呆在家里”。

为了在 if 语句中描述这种情况，if 语句中提供了 else 子句，else 子句表示的自然语句是“否则”的意思，它的语法格式为：

if (表达式)

语句；

else

语句;

下面利用 else 子句在计算机中描述自然语言“如果今天不下雨，我们就去放风筝，否则我们呆在家里”。

复杂 if 语句

//定义一个表示天气的枚举类型

typedef enum Weather{WH_RAIN = 0, WH_SUN = 1, WH_WIND = 2, SH_SNOW = 3};

int main(int argc, char* argv[])

{

Weather today = WH_SUN; //定义一个变量 today 表示今天的天气

if (today != WH_RAIN) //如果天气不等于雨

{

cout << "我们去放风筝" << endl; //我们去放风筝

}

else //否则

{

cout << "我们呆在家里" <<endl; //呆在家里

}

return 0;

}

使用 if 语句和 else 子句能够描述一些复杂的逻辑问题，但是有时并不能够完整地表达人们的语义。考虑这样一种情况，“如果成绩大于等于 90，为优秀，否则如果成绩大于等于 80，则良好，否则如果成绩大于等于 60，则及格，否则为不及格”。这样的逻辑关系可以使用流程图来描述，如图 1 所示。

图 1 逻辑判断流程图

下面使用简单的 if 语句来描述上述情况，代码如下：

int nGrade = 80; //定义一个整型变量，初始化为 80

if (nGrade >= 90) //区域判断

cout << "优秀" << endl; //输出信息

if (nGrade >= 80 && nGrade < 90) //区域判断

cout << "良好" << endl; //输出信息

if (nGrade >= 60 && nGrade < 80) //区域判断

cout << "及格" << endl; //输出信息

if (nGrade < 60) //区域判断

cout << "不及格" << endl; //输出信息

代码的执行方式如图 2 所示。

图 2 代码逻辑判断示意图

从图 1 和图 2 中，可以发现这两幅图的代码逻辑判断是不同的，尽管他们描述的是同一个问题。很显然，图 1 描述的逻辑更清晰，更合理。因为如果某一个条件成立，则直接输出相应信息，并结束条件判断。而图 2 表示的情况则不同，如果某一个条件成立，它输出相应信息后，将继续向下判断其他的条件是否成立。就本例描述的问题而言，如果一个条件已经成立，就没有再判断其他条件了。因此上面使用 if 语句编写的代码执行效率是低下的，它没有完整的描述用户的逻辑。为了在 if 语句中实现多个逻辑条件的判断，if 语句提供一个 else if 子句，它能够在之前的 if 表达式不成立的情况下，继续判断一个条件是否成立，语法格式为：

if (表达式)

语句;

else if (表达式)

语句;

.

.

.

else

语句；

其中，一个 if 语句可以关联多个 else if 条件，else 子句是可选的。下面利用 else if 子句来实现图 1 描述的示意图。

int nGrade = 80; //定义一个整型变量，初始化为 80

if (nGrade >= 90) //区域判断,大于 90

{

cout << "优秀" << endl; //输出信息

}

else if (nGrade >= 80) //区域判断, (90, 80)区间

{

cout << "良好" << endl; //输出信息

}

else if (nGrade >= 60) //区域判断,(80, 60) 区间

{

cout << "及格" << endl; //输出信息

}

else //小于 60

{

cout << "不及格" << endl; //输出信息

}

通过使用 else if 子句不但减少了逻辑条件判断的表达式，还提高了代码的执行效率。

为了描述复杂的逻辑条件，if 语句还允许嵌套。即 if 语句中还包含 if 语句。例如，下面的代码利用嵌套的 if 语句来进一步判断成绩是否进行了确认。

int nGrade = 100; //定义一个整型变量，初始化为 100

bool bchecked = true; //定义一个布尔类型变量，初始化为 true

if (nGrade >= 90) //外层 if 语句

{

if (bchecked) //内层 if 语句

{

cout << "成绩优秀，已经确认" << endl; //输出语句

}

else //内层 else 语句

{

cout << "成绩优秀，没有确认" << endl; //输出语句

}

}

对于上述代码，还可以修改为如下的形式。

int nGrade = 100; //定义一个整型变量，初始化为 100

bool bchecked = true; //定义一个布尔类型变量，初始化为 true

if (nGrade >= 90) //外层 if 语句

if (bchecked) //内层 if 语句

cout << "成绩优秀，已经确认" << endl; //输出语句

else //内层 else 语句

cout << "成绩优秀，没有确认" << endl; //输出语句

在上面的代码中，注意 else 子句，这里 else 子句是与“if (bchecked)”语句对应，即采用就近原则，else 子句与其之前最近的 if 语句对应，尽管没有使用复合语句分隔。在编写嵌套的 if 语句时，建议使用复合语句将每一层的 if 语句分离，这样可以使代码结果更清晰，防止别人产生误解。

在使用 if 语句时，开发人员经常会犯一些类似于下面的错误。

q 在 if 语句表达式部分定义对象，在 if 语句块之外访问对象

在我们在 if 表达式部分定义一个对象时，对象的作用域仅限于 if 语句块。如果在 if 语句块之外访问对象，将出现标识符没有声明的错误。例如：

int nLen = 10; //定义一个整型变量，初始化为 10

int nData = 300; //定义一个整型变量，初始化为 100

if (int nRet = GetMaxValue(nLen, nData)) //if 表达式中定义一个变量 nRet

{

cout << "获取最大值： " << nRet << endl; //输出 nRet

}

cout << "最大值: " << nRet << endl; //错误的语句，标识符 nRet 没有声明

q 误将关系运算符“==”写为赋值运算符“=”

在编写 if 语句时，如果表达式是一个“等于”的判断，将“==”运算符写为“=”运算符在语法上是合法的，但在逻辑上是错误的。例如，判断两个整型变量的值是否相等。

int nLen = 10; //定义一个整型变量，初始化为 10

int nData = 300; //定义一个整型变量，初始化为 100

if (nLen = nData) //误将==写为=

{

cout << "相等" << endl; //输出信息

}

else

{

cout << "不相等" << endl; //输出信息

}

上面的语句意图是比较 nLen 与 nData 是否相等，但是却写成的赋值的形式。表达式“nLen = nData”的结果为 300，即非零，因此执行 if 语句块，输出了“相等”的信息。这样的错误在调试程序时可以很容易的发现，但是如果变量 nData 的值为 0，则上面的语句输出了“不相等”信息，因为“nLen = nData”的结果为 0，执行了 else 语句块，此时我们很容易忽略了错误检查。

注意：else 子句在使用时采用就近原则，既 else 子句与其之前最近的 if 语句对应。