C语言程序设计教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.2 逻辑运算

关系运算处理的是简单的比较运算,而逻辑运算则处理的是复杂的关系运算。例如,要求x大于等于10且小于等于20时,这样的条件如果要正确表示就要用到逻辑运算。

4.2.1 逻辑运算符

在C语言中有3种逻辑运算符,见表4.2。

表4.2 逻辑运算符

其中,“&&”和“||”为双目运算符;“!”为单目运算符,应出现在运算对象的左边。

(1)逻辑运算符的优先级

① 在3种逻辑运算符中,逻辑非“!”的优先级最高,逻辑与“&&”次之,逻辑或“||”最低。

② 逻辑运算符“&&”和“||”的优先级低于关系运算符,而“!”高于算术运算符。

例如:

      a>b&&x>y         等价于     (a>b)&&(x>y)
      !a+1||a>b        等价于     ((!a)+1)||(a>b)

(2)逻辑运算的规则

① 逻辑与“&&”:参与运算的两个量都为真时,结果才为真,否则为假。例如,5>2 &&4>0,由于5>2为真,4>0为真,所以相与的结果也为真。

② 逻辑或“||”:参与运算的两个量只要有一个为真,结果就为真。两个量都为假时,结果为假。例如,5>0||5>6,由于5>0 为真,相或的结果也就为真。又如,5<2||5>6,由于5<2和5>6均为假,相或的结果也就为假。

③ 逻辑非“!”:参与的运算量为真时,结果为假;参与的运算量为假时,结果为真。例如,!(5<2),由于(5<2)为假,非的结果就为真。

逻辑运算的规则可用逻辑运算真值表表示,见表4.3。

表4.3 逻辑运算真值表1

4.2.2 逻辑运算的值

逻辑运算的值有“真”和“假”两种,C语言编译系统在给出逻辑运算值时,以“1”代表真,“0”代表假。

判断一个量为“真”还是“假”时,以数值0代表“假”,以非0的数值代表“真”。例如,由于5和2均为非0,因此逻辑运算5&&2的值为“真”,即为1。又如,由于!5为假,即0,所以逻辑运算!5||0的值为假,即0。

所以逻辑运算规则可以改为表4.4。

表4.4 逻辑运算真值表2

4.2.3 逻辑表达式

逻辑表达式是指用逻辑运算符将运算对象连接起来的符合C语言规则的式子。逻辑表达式的一般形式为:

            [表达式]  逻辑运算符  表达式

例如:

            x>10 && x<20
            4&&0||(a=2)
            'c' &&'d'
            !a<b

注意:逻辑表达式的值只能是 0 1,不可能是其他数值,而在逻辑表达式中参与逻辑运算的运算对象却可以是任意数据类型的数据(如字符型、实型、指针型等)。

【例4.2】 逻辑运算示例。

程序代码如下:

            /* 逻辑运算示例 */
            #include "stdio.h"
            main( )
            {
              char c='b';
              int i=1,j=2,k=3;
              printf("%d,",!i*!j);
              printf("%d,",i<j&&'a'<c);
              printf("%d\n",i==5&&c&&(j=8));
            }

程序运行结果为:

0,1,0

需要强调的是,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个(右侧)逻辑运算符才能求出表达式的值时,才执行该运算符。例如,下列逻辑表达式:

            a&&b&&c

在求其值时有以下4种情况:

● 只有a为真时,才需要判断b的值;

● 只有a、b都为真时,才需要判断c的值;

● 如果a为假,则此时整个表达式已经确定为假,就不必判断b和c了;

● 如果a为真,b为假,则不必判断c。

请思考,下列程序段执行后的输出结果是什么?

            int a=1,b=2,c=3,d=4,m=1,n=1;
            printf(“%d,%d,%d\n”, (m=a>b)&&(n=c>d),m,n);

根据运算符的运算规则及优先级和结合性,由于“a>b”为假(0),则赋值表达式“m=a>b”的值为0,变量m的值也为0,此时整个表达式的结果已知(为0),不再进行表达式“n=c>d”的计算,所以n的值依然是1,并未改变。

又如下列逻辑表达式:

            a||b||c

● 只要a为真,则整个表达式已经确定为真,就不必判断b和c了;

● 如果a为假,b为真,则整个表达式已经确定为真,就不必判断c了;

● 只有a、b都为假时才判断c。

请思考,下列程序段执行后的输出结果是什么?

            int a=1,b=2,c=3,d=4,m=1,n=1;
            printf(“%d,%d,%d\n”, (m=a>b)||(n=c>d),m,n);

根据运算符的运算规则及优先级和结合性,由于“a>b”为假(0),则赋值表达式“m=a>b”的值为0,变量m的值也为0,此时整个表达式的结果还不能确定,所以继续进行运算符“||”右侧表达式的计算,由于“c>d”为假(0),则赋值表达式“n=c>d”的值为 0,变量 n 的值也为0,此时整个表达式的结果已知(为0)。

掌握了 C 语言的关系运算符和逻辑运算符后,就可以表示一个复杂的条件了。例如,判断某一年是否是闰年。判断闰年的方法是看是否符合下面两个条件之一:①能被4整除,但不能被100整除;②能被400整除。假设用标识符year表示某一年,则第一个条件可表示为:

            year%4==0 && year%100!=0

第二个条件可表示为:

            year%400==0

综合起来,判断闰年的条件可以用一个逻辑表达式表示:

            (year%4==0&&year%100!=0) ||year%400==0

表达式为真,闰年条件成立,是闰年;否则不是闰年。