09-用&&来设置取值范围
6.2.3 用&&来设置取值范围
&&运算符还允许建立一系列if else if else语句,其中每种选择都对应于一个特定的取值范围。程序清单6.6演示了这种方法。另外,它还演示了一种用于处理一系列消息的技术。与char指针变量可以通过指向一个字符串的开始位置来标识该字符串一样,char指针数组也可以标识一系列字符串,只要将每一个字符串的地址赋给各个数组元素即可。程序清单6.6使用qualify数组来存储4个字符串的地址,例如,qualify [1]存储字符串“mud tug-of-war\n”的地址。然后,程序便能够将cout、strlen()或strcmp()用于qualify [1],就像用于其他字符串指针一样。使用const限定符可以避免无意间修改这些字符串。
程序清单6.6 more_and.cpp
// more_and.cpp -- using the logical AND operator
#include <iostream>
const char * qualify[4] = // an array of pointers
{ // to strings
"10,000-meter race.\n",
"mud tug-of-war.\n",
"masters canoe jousting.\n",
"pie-throwing festival.\n"
};
int main()
{
using namespace std;
int age;
cout << "Enter your age in years: ";
cin >> age;
int index;
if (age > 17 && age < 35)
index = 0;
else if (age >= 35 && age < 50)
index = 1;
else if (age >= 50 && age < 65)
index = 2;
else
index = 3;
cout << "You qualify for the " << qualify[index];
return 0;
}
下面是该程序的运行情况:
Enter your age in years: 87
You qualify for the pie-throwing festival.
由于输入的年龄不与任何测试取值范围匹配,因此程序将索引设置为3,然后打印相应的字符串。
程序说明
在程序清单6.6中,表达式age > 17 && age < 35测试年龄是否位于两个值之间,即年龄是否在18岁到34岁之间。表达式age >= 35 && age < 50使用<=运算符将35包括在取值范围内。如果程序使用age > 35 && age < 50,则35将被所有的测试忽略。在使用取值范围测试时,应确保取值范围之间既没有缝隙,又没有重叠。另外,应确保正确设置每个取值范围(参见本节后面的旁注“取值范围测试”)。
if else语句用来选择数组索引,而索引则标识特定的字符串。
取值范围测试
取值范围测试的每一部分都使用AND运算符将两个完整的关系表达式组合起来:
if (age > 17 && age < 35) // OK
不要使用数学符号将其表示为:
if (17 < age < 35) // Don't do this!
编译器不会捕获这种错误,因为它仍然是有效的C++语法。<运算符从左向右结合,因此上述表达式的含义如下:
if ( (17 < age) < 35)
但17 < age的值要么为true(1),要么为false(0)。不管是哪种情况,表达式17 < age的值都小于35,因此整个测试的结果总是true!