我们也可以用逻辑与(Logical AND)运算符表示这两个条件同时成立。逻辑与运算符在C语言中写成两个&号(Ampersand),上面的语句可以改写为:

    1. if (a < b && b < c) {
    2. printf("b is between a and c.\n");
    3. }

    对于a < b && b < c这个控制表达式,要求“a < b的值非0”和“的值非0”这两个条件同时成立整个表达式的值才为1,否则整个表达式的值为0。也就是只有两个条件都为真,它们做逻辑与运算的结果才为真,有一个条件为假,则逻辑与运算的结果为假,如下表所示:

    表 4.2. AND的真值表

    这种表称为真值表(Truth Table)。注意逻辑与运算的操作数以非0表示真以0表示假,而运算结果以1表示真以0表示假(类型是int),我们忽略这些细微的差别,在表中全部以1表示真以0表示假。C语言还提供了逻辑或(Logical OR)运算符,写成两个|线(Pipe Sign),逻辑非(Logical NOT)运算符,写成一个!号(Exclamation Mark),它们的真值表如下:

    表 4.3. OR的真值表

    表 4.4. NOT的真值表

    逻辑或表示两个条件只要有一个为真,它们做逻辑或运算的结果就为真,只有两个条件都为假,逻辑或运算的结果才为假。逻辑非的作用是对原来的逻辑值取反,原来是真的就是假,原来是假的就是真。逻辑非运算符只有一个操作数,称为单目运算符(Unary Operator),以前讲过的加减乘除、赋值、相等性、关系、逻辑与、逻辑或运算符都有两个操作数,称为双目运算符(Binary Operator)。

    关于逻辑运算的数学体系称为布尔代数(Boolean Algebra),以它的创始人布尔命名。在编程语言中表示真和假的数据类型叫做布尔类型,在C语言中通常用int型来表示,非0表示真,0表示假[]。布尔逻辑是写程序的基本功之一,程序中的很多错误都可以归因于逻辑错误。以下是一些布尔代数的基本定理,为了简洁易读,真和假用1和0表示,AND用*号表示,OR用+号表示(从真值表可以看出AND和OR运算确实有点像乘法和加法运算),NOT用¬表示,变量xyz的值可能是0也可能是1。

    ¬¬x=x

    x*0=0
    x+1=1

    x*x=x
    x+x=x

    x*¬x=0
    x+¬x=1

    x*y=y*x
    x+y=y+x

    x*(y*z)=(x*y)*z
    x+(y+z)=(x+y)+z

    x*(y+z)=x*y+x*z
    x+y*z=(x+y)*(x+z)

    x+x*y=x
    x*(x+y)=x

    x*y+x*¬y=x
    (x+y)*(x+¬y)=x

    ¬(x*y)=¬x+¬y
    ¬(x+y)=¬x*¬y

    x+¬x*y=x+y
    x*(¬x+y)=x*y

    x*y+¬x*z+y*z=x*y+¬x*z
    (x+y)*(¬x+z)*(y+z)=(x+y)*(¬x+z)

    目前为止介绍的这些运算符的优先级顺序是:!高于* / %,高于+ -,高于> < >= <=,高于== !=,高于&&,高于||,高于=。写一个控制表达式很可能同时用到这些运算符中的多个,如果记不清楚运算符的优先级一定要多套括号。我们将在第 4 节 “运算符总结”总结C语言所有运算符的优先级和结合性。

    1、把代码段

    改写成下面这种形式:

    1. if (____ || ____)
    2. printf("x is out of range.\n");

    ____应该怎么填?

    2、把代码段:

    改写成下面这种形式:

    1. printf("Test failed!\n");
    2. else
    3. printf("Test OK!\n");

    ____应该怎么填?

    3、有这样一段代码:

    要进入最后一个,x和y需要满足条件____ || ____。这里应该怎么填?

    4、以下哪一个if判断条件是多余的可以去掉?这里所谓的“多余”是指,某种情况下如果本来应该打印Test OK!,去掉这个多余条件后仍然打印Test OK!,如果本来应该打印Test failed!,去掉这个多余条件后仍然打印Test failed!

    1. if (x<3 && y>3)
    2. printf("Test OK!\n");
    3. else if (x>=3 && y>=3)
    4. else if (z>3 && x>=3)
    5. printf("Test OK!\n");
    6. else if (z<=3 && y>=3)
    7. printf("Test OK!\n");
    8. else
    9. printf("Test failed!\n");