09-逻辑运算符
7.3 逻辑运算符
读者已经很熟悉了, if 语句和 while 语句通常使用关系表达式作为测试条件。有时,把多个关系表达式组合起来会很有用。例如,要编写一个程序,计算输入的一行句子中除单引号和双引号以外其他字符的数量。这种情况下可以使用逻辑运算符,并使用句点( . )标识句子的末尾。程序清单7.6用一个简短的程序进行演示。
程序清单7.6 chcount.c 程序
// chcount.c -- 使用逻辑与运算符
#include <stdio.h>
#define PERIOD '.'
int main(void)
{
char ch;
int charcount = 0;
while ((ch = getchar()) != PERIOD)
{
if (ch != '"' && ch != '\'')
charcount++;
}
printf("There are %d non-quote characters.\n", charcount);
return 0;
}
下面是该程序的一个输出示例:
I didn't read the "I'm a Programming Fool" best seller.
There are 50 non-quote characters.
程序首先读入一个字符,并检查它是否是一个句点,因为句点标志一个句子的结束。接下来, if 语句的测试条件中使用了逻辑与运算符 && 。该 if 语句翻译成文字是“如果待测试的字符不是双引号,并且它也不是单引号,那么 charcount 递增 1 ”。
逻辑运算符两侧的条件必须都为真,整个表达式才为真。逻辑运算符的优先级比关系运算符低,所以不必在子表达式两侧加圆括号。
C有3种逻辑运算符,见表7.3。
| 逻辑运算符 | 含义 |
| :----- | :----- | :----- | :----- |
| && | 与 |
| || | 或 |
| ! | 非 |
假设 exp1 和 exp2 是两个简单的关系表达式(如 car > rat 或 debt == 1000 ),那么:
- 当且仅当
exp1和exp2都为真时,exp1 && exp2才为真; - 如果
exp1或exp2为真,则exp1 || exp2为真; - 如果
exp1为假,则!exp1为真;如果exp1为真,则!exp1为假。
下面是一些具体的例子:
5 > 2 && 4 > 7为假,因为只有一个子表达式为真;
5 > 2 || 4 > 7为真,因为有一个子表达式为真;
!(4 > 7)为真,因为4不大于7。
顺带一提,最后一个表达式与下面的表达式等价:
4 <= 7
如果不熟悉逻辑运算符或者觉得很别扭,请记住: ( 练习 && 时间 )== 完美。