3.1.4 逻辑运算符和表达式(1)
如前所述,当有两个或更多相关条件时,使用if语句会比较麻烦。在用if语句查找coffee和donuts时,我们已经发挥出了自己的聪明才智,但是,实际上我们可能想要测试更为复杂的条件。
逻辑运算符提供了既简洁又方便的解决方案。使用逻辑运算符,可以将一系列比较组合成一个逻辑表达式。因此,只要判断问题最终归结为在真假两种可能性之间选择,则无论条件集多么复杂,最终需要的都只是一条if语句。
逻辑运算符只有3个:
1. 逻辑与
如果两个条件必须都是true时结果才为真,则可以使用"与(AND)"运算符&&。当两个操作数的值都是true时,&&运算符的结果才是true,否则结果是false。
当测试某个字符以确定其是否为大写字母时,可以使用&&运算符,被测试的数值必须既大于等于'A',又小于等于'Z'。这两个条件必须都返回true,才能确定被测试的字符是大写字母。
如前所述,用逻辑运算符组合起来的条件可能返回数值。记住,这种情况下非零值被强制转换为bool值true,而零值被强制转换为false。
还以在char型的变量letter中存储数值为例,可以用仅包括一个if和&&运算符的表达式来代替原来使用了两个if语句的测试条件。
- if((letter >= 'A') && (letter <= 'Z'))
- cout << "This is a capital letter.";
if条件表达式内的圆括号确保比较操作首先执行,这样会使语句更清楚。输出语句仅当&&运算符组合的两个条件都为true时才执行。
如果&&运算符左边的操作数是false,则不再对右边的操作数求值。当右边的操作数是一个会改变某些东西的表达式,如涉及++或--运算符的表达式时,这一特点就变得非常有意义。例如,在表达式x > =5 && ++n < 10中,如果x小于等于5,则n将不递增。
2. 逻辑或
如果希望两个条件之一或全部为真时结果为true,则应该使用"或(OR)"运算符 ||。例如,只有年收入至少为100 000美元,或者有1 000 000美元现金,银行才认为我们有资格申请贷款。下面的if语句可以测试这个条件。
- if((income >= 100000.00) || (capital >= 1000000.00))
- cout << "How much would you like to borrow, Sir (grovel, grovel) ";
当这两个条件中的一个或两个为true时,才会显示这条响应消息。只有当两个操作数的值都是false时,|| 运算符的结果才是false。
如果 || 运算符左边的操作数是true,则不再对右边的操作数求值。例如,在表达式x > =5 || ++n < 10中,如果x大于等于5,则变量n将不递增。
3. 逻辑非
第三个逻辑运算符 ! 将某个bool类型操作数的值取反。因此,如果变量test的值为true,则 !test为false;如果test为false,则 !test为true。以一个简单的表达式为例,如果x的值是10,则下面的表达式
- !(x > 5)
为false,因为x > 5 为true。
还可以在Charles Dickens特别喜爱的一个表达式中应用 ! 运算符:
- !(income > expenditure)
如果该表达式为true,则悲惨的生活至少从银行开始拒付支票那一刻起就降临了。
最后,可以对其他基本数据类型应用 ! 运算符。假设变量rate是float类型,值为3.2。如果想通过测试来证明rate的值不是零,则可以使用下面的表达式:
- !(rate)
值3.2是非零值,因此转换为bool值true,这样该表达式的结果就是false。
试一试:组合逻辑运算符
只要认为合适,就可以任意地组合条件表达式和逻辑运算符。例如,可以仅仅使用一个if语句就构造出测试某个变量是否包含某个字母的条件。下面将其写成一个可运行的示例:
- // Ex3_03.cpp
- // Testing for a letter using logical operators
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
- int main()
- {
- char letter(0); // Store input in here
- cout << endl
- << "Enter a character: ";
- cin >> letter;
- if(((letter >= 'A') & & (letter <= 'Z')) ||
- ((letter >= 'a') & & (letter <= 'z'))) // Test for alphabetic
- cout << endl
- << "You entered a letter." << endl;
- else
- cout << endl
- << "You didn't enter a letter." << endl;
- return 0;
- }