(四)语句形式 -- 3 布尔型数据

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)
    对任何逻辑表达式pq,存在以下两条规则:
    ! (p || q) 等价于 !p && !q
    ! (p && q) 等价于!p || !q

常见错误:
测试一个数是否在某一特定范围内,只用关系运算符把它们组合起来是不够的。
条件的两个部分必须明确地用&&连起来。

(0 < x) && (x < 10)

3.3 简化求值

  • 简化求值(short-circuit evaluation)

    当C程序在计算如下形式的表达式

    exp1 && exp2
    

    exp1 || exp2
    

    时,子表达式总是从左到右各自被计算。一旦能确定结果就中止计算。
    例如,若&&表达式中的exp1FALSE, 则不需要计算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章 语句形式

猜你喜欢

转载自blog.csdn.net/m0_38111466/article/details/108899861
今日推荐