3. 布尔型数据
- 布尔型数据(boolean data)
合法值只能为TRUE或FALSE的数据。
C语言定义的使用布尔型数据的运算符,分为两大类:
关系运算符、逻辑运算符。
3.1 关系运算符
- 关系运算符(relational operator)
用来比较两个值。
(1) 比较两个数值大小关系
> 大于
< 小于
>=大于等于
<= 小于等于
(2) 判断相等关系
== 等于
!= 不等于
运算符优先级排序:
判断相等关系 < 比较两个数值大小关系 < 算术运算符(+或-)
常见错误:
一个等号是赋值运算符;
关系运算符只能用来比较原子数据(atomic data)值——不能再分解成更小的部分的数据。
3.2 逻辑运算符
- 逻辑运算符(logical operator)
操作数为布尔型的值,把它们组合起来形成另一个布尔值。
! 逻辑非(如果后面的操作数为FALSE,则值为TRUE)。
&& 逻辑与(如果两个操作数均为TRUE,则值为TRUE)。
|| 逻辑或(如果其中一个操作数为TRUE,则值为TRUE)。
- 德·摩根定律(DeMorgan law)
对任何逻辑表达式p
和q
,存在以下两条规则:
! (p || q)
等价于!p && !q
! (p && q)
等价于!p || !q
常见错误:
测试一个数是否在某一特定范围内,只用关系运算符把它们组合起来是不够的。
条件的两个部分必须明确地用&&
连起来。
(0 < x) && (x < 10)
3.3 简化求值
-
简化求值(short-circuit evaluation)
当C程序在计算如下形式的表达式
exp1 && exp2
或
exp1 || exp2
时,子表达式总是从左到右各自被计算。一旦能确定结果就中止计算。
例如,若&&
表达式中的exp1
为FALSE
, 则不需要计算exp2
, 因为结果能确定为FALSE
。
像这种只要结果确定就停止计算的方法叫做简化求值。
优点:
第一个条件能控制第二个条件的执行。
例如,要表达以下两个条件。第一,整型变量x
的值非零;第二,x
能整除y
。
由于表达式 y%x
只有在x
不为0时才计算,所以可表达这个条件测试为:
(x != 0) && (y % x == 0)
上述例子中
(x != 0)
这样的为了防止随后部分出现计算错误的条件测试叫做监护条件(guard)。
3.4 标志
bool
型变量在程序设计中,还有个特殊的名字:标志(flag)。
例如,按如下方式声明一个布尔型变量:
bool done;
变量done
便成了一个标志,可以用它来记录程序中是否完成了一定的操作。
可以像对其他任何变量一样给标志赋值。如:
done=TRUE;
更重要的是,可以将任何值为布尔型的表达式赋值给一个布尔变量。
例如,要求只要变量 itemsRemaining
的值为0,立即结束一些特定的操作。
那么,可以用如下方法给done
赋予合适的值:
done = (itemsRemaining==0);
常见错误:
使用布尔型的数据时,要避免冗余。当
- 将一个布尔值与常量TRUE相比较
- 用一个if语句产生一个布尔型的结果值
时,其实这个值已经可以作为条件表达式使用的情况。
3.5 代码示例
#include <stdio.h>
/* Determine whether it is a leap year. */
main() {
int year;
_Bool isLeapYear;
printf("Which year? ");
scanf("%d", &year);
isLeapYear = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
if (isLeapYear) {
printf("%d is a leap year.\n", year);
} else {
printf("%d is not a leap year.\n", year);
};
}
参考
《C语言的科学和艺术》 —— 第4章 语句形式