要作出决策,需要一种比较机制,而比较有几种类型。像“如果交通信号灯是红色,就停车”这样的决策就涉及到相等比较。在这种情况下,需要比较信号灯的颜色和参考颜色(即红色),如果它们相同,就停车。另一方面,像“如果车速超过极限值,就减速”这样的决策涉及到另一种关系:检查车速是否大于当前的速度极限值。这两种比较是类似的,因为它们都会得到下面两个值中的一个:真或假。这就是C++中的比较过程。
使用一些运算符就可以比较数据值,这些运算符称为关系运算符。用于比较两个值的有6个基本运算符,如表4-1所示。
表4-1 关系运算符
|
关系运算符 |
说 明 |
关系运算符 |
说 明 |
|
< |
小于 |
<= |
小于等于 |
|
> |
大于 |
>= |
大于等于 |
|
== |
等于 |
!= |
不等于 |
注释:
其中的“等于”比较运算符(==)是两个连续的等号,它不同于只包含一个等号的赋值运算符(=)。在进行相等比较时,常常容易犯只使用一个等号的错误。对此,编译器一般不会发出错误消息,因为表达式可能是有效的,只是不能得出我们希望的结果。所以用户需要非常小心,避免出现这种错误。
这些二元运算符都是比较两个值,如果比较是真,就返回true,否则就返回false。值true和false是C++中的关键字,也是一种新的字面量,称为布尔字面量(以布尔代数之父George Boole的名字命名),其类型是bool。
如果把值true强制转换为整数类型,结果就是1,如果把值false强制转换为整数类型,结果就是0。还可以把数值强制转换为bool类型。0会强制转换为false,其他非0值则强制转换为true。
与其他标准类型一样,也可以创建bool类型的变量,来存储布尔值。声明该变量的方法与声明其他类型的变量一样,例如:
bool decision = true; //Declare, define and initialize a logical variable
这个语句把变量decision声明并定义为布尔类型,还给它赋予初始值true。
4.1.1 应用比较运算符
下面介绍几个使用比较运算符的例子,说明其工作原理。假定有两个整数变量i和j,其值分别是10和–5。在下面的逻辑表达式中使用它们:
i >j i!=j j >–8 i <= j + 15
这些表达式都等于true。注意在最后一个表达式i <= j + 15中,相加运算j + 15要先执行,因为+的优先级高于<=的优先级。可以在bool类型的变量中存储这些表达式的结果。例如:
decision = i >j; //true if i is greater than j, false otherwise
如果i大于j,就在bool变量decision中存储true,否则就存储false。
也可以比较char类型的变量。假定定义了下面的变量:
char first = 'A';
char last = 'z';
现在编写使用这些变量的比较示例,如下所示:
first < last 'E' <= first first != last
第一个表达式检查first的值'A'是否小于last的值'z',这总是true。参考附录A中这些字符的ASCII编码,就可以验证这一点。大写字母用一组递增的数值65~90来表示,65表示'A',90表示'Z'。第二个表达式的结果为false,因为'E'大于first的值。最后一个表达式是true,因为'A'肯定不等于'z'。
输出bool值与输出其他类型的值一样简单,下面举一个例子。
程序示例4.1—— 比较数据值
这个例子从键盘上读取两个char值,输出比较它们的结果:
//Program 4.1 Comparing data values
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {
char first = 0; //Stores the first character
char second = 0; //Stores the second character
//Prompt for and read in the first character
cout<<"Enter a character:";
cin>> first;
//Prompt for and read in the second character
cout << "Enter a second character:";
cin >> second;
cout << "The value of the expression first < second is: "
<< ( first < second)
<< endl
<< "The value of the expression first == second is: "
<< ( first == second)
<< endl;
retuen 0;
}
这个程序输出的结果如下所示:
Enter a character: p
Enter a second character: t
The value of the expression first < second is: 1
The value of the expression first == second is: 0
例子的说明
提示用户输入,并从键盘上读取字符的过程是前面介绍过的标准过程。在下面的语句中输出应用<和==运算符的结果:
cout << "The value of the expression first < second is: "
<< (first < second)
<< endl
<< "The value of the expression first == second is: "
<< (first == second)
<< endl;
注意把比较表达式括起来的括号是必不可少的,否则编译器就不能正确解释该语句,而输出错误消息。该表达式比较用户输入的第一个和第二个字符。从上面的输出结果可以看出,值true显示为1,值false显示为0。
true和false的输出值1和0是true和false的默认表示。如果希望布尔值在屏幕上显示为true和false,可以使用输出操纵程序boolalpha来实现。在main()的开头添加下面的语句:
cout << std::boolalpha;
如果再次编译并运行这个例子,bool值就会显示为true或false。要在程序中把布尔值的结果返回为默认设置,可以使用操纵程序noboolalpha。
4.1.2 比较浮点数值
当然,也可以比较浮点数值。考虑一个略复杂的数值比较。首先,用下面的语句定义一些变量:
int i =–10;
int j = 20;
double x = 1.5;
double y =–0.25E–10;
现在看看下面的逻辑表达式:
–1 < y j < (10-i) 2.0*x >= (3+y)
在表达式中,可以把数据值用作比较中的操作数。因为比较运算符的优先级总是低于算术运算符(参见附录D),所以不需要使用括号,但使用括号有助于使表达式更容易理解。
第一个比较的结果是true,因为变量y是一个非常小的负值(–0.000000000025),它大于–1。第二个比较的结果是false,因为表达式10–i的值是20,与j相同。第三个表达式为true,因为3+y略小于3。
可以使用关系运算符比较任何基本类型的值,现在需要一种实用的方式来使用比较的结果,以改变程序的行为。下面就介绍这些内容。





