C 语言的逻辑运算符包括三种:
逻辑运算符可以将两个关系表达式连接起来.
Suppose exp1 and exp2 are two simple relational expressions, such as cat > rat and debt == 1000 . Then you can state the following:
■ exp1 && exp2 is true only if both exp1 and exp2 are true.
■ exp1 || exp2 is true if either exp1 or exp2 is true or if both are true.
■ !exp1 is true if exp1 is false, and it’s false if exp1 is true.
&& 和 || 都是序列点.
因此, 一旦发现某个元素使得整个表达式无效, 将会立刻停止求值而不会继续向后计算.
例如, 语句:
while ((c = getchar()) != ' ' && c != '\n')
读取字符直到遇到第一个空格或者换行符, 第一个子表达式将读取到的字符赋值给 c. 后面的子表达式还会用到 c. 如果没有求值顺序的保证, 编译器可能会在给 c 赋值之前先对后面的表达式求值.
再例如, 语句:
if (num != 0 && 12 / num)
如果 num 为 0, 则第一个子表达式为假, 则整个表达式为假, 则不再继续对第二个子表达式求值, 这样可以避免把 0 作为除数.
逻辑表达式从左向右求值, 一旦算到了某个子表达式时, 发现整个表达式的值为真或假的结果能得到了, 则停止计算, 因此 && 和 || 都是短求值.
&& 可以用于范围测试, 例如, 语句:
if (num > 90 && num < 100) // 测试 num 是否大于 90 且小于 100
再例如, 语句:
if (c >= 'a' && c <= 'z') // 判断 c 是否是一个小写字母
{printf("%c is a lowercase character.\n", c);
}
上述代码只适用于相邻字母与相邻数字一一对应的字符编码, 例如 ASCII.
一种可移植的方法为:
if (islower(c)) // 判断 c 是否是一个小写字母
{printf("%c is a lowercase character.\n", c);
}
无论使用哪种字符编码, islower() 函数都能正常执行.