回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C 语言基础教程 >> 49. 逻辑运算符
最 近 更 新
54. goto 语句
53. switch 语句推荐
52. continue 和 break
51. 条件运算符(?:)
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
46. if 语句
45. 循环应用实例 2
最 新 推 荐
53. switch 语句推荐
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
44. 循环应用实例 1推荐
43. 循环嵌套推荐
40. for 循环推荐
37. 关系运算符推荐
36. while 循环推荐
热 门 排 行
2. 第一个 C 程序推荐
31. 预处理指令 #define..推荐
1. C 语言简介
11. 基本数据类型:整型..推荐
24. 运算符的优先级和结..推荐
5. 如何编写函数
30. 字符串字面量推荐
13. 标识符命名规则
36. while 循环推荐
7. 第三个 C 程序推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

49. 逻辑运算符


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:强烈推荐
发布于2006-12-17 18:02 被读3085次 【字体:

一、逻辑运算符

    C 语言提供了三个逻辑运算符

           运算符   |  含义  |   学名   |  结合律
        --------------------------------------------
             &&     |  并且   |  逻辑与  | 从左到右
        --------------------------------------------
             ||     |  或者   |  逻辑或  | 从左到右
        --------------------------------------------
             !      |   非    |  逻辑非  | 从右到左
        --------------------------------------------

下面我们通过一个简单的例子来学习这三个运算符。

        /*--------------------------------------------------------------
         | 作者: Antigloss @ http://stdcpp.cn @ 蚂蚁的 C/C++ 标准编程
         | 
         | 功能: 演示 &&、|| 及 ! 的用法
          -------------------------------------------------------------*/

        #include <stdio.h>

        int main(void)
        {
            int i_num;

            printf("Please enter an integer: ");
            scanf("%d", &i_num);

            if ( !i_num )    /* 效果等同于 i_num == 0 */
            {   /* 如果用户输入 0 */
                printf("i_num got a value of zero.\n");
            }
            else if ( i_num >= 1 && i_num <= 9 )
            {   /* 如果用户输入介于 1 到 9 之间(包括 1 和 9)*/
                printf("i_num is between 1 and 9, inclusive.\n");
            }
            else if ( i_num < -9 || i_num > 9 )
            {   /* 如果用户输入小于 -9 或者大于 9 */
                printf("i_num is less than -9 or greater than 9.\n");
            }
            else
            {   /* 其它情况 */
                printf("i_num is between -9 and -1, inclusive.\n");
            }

            return 0;
        }

程序重点:

    1. !i_num

        如果 i_num 的值不为零,则 !i_num 为假;如果 i_num 的值为零,则 !i_num 为真。
    也就是说,! 的作用是把真变为假,把假变成真。

    2. i_num >= 1 && i_num <= 9

        只有 i_num >= 1 和 i_num <= 9 同时为真,该表达式的值才为真。

    3. 别以为 i_num >= 1 && i_num <= 9 可以像数学里那样写成 9 >= i_num >= 1 或者
       1 <= i_num <= 9。以 9 >= i_num >= 1 为例,由于关系运算符是从左到右进行结合的,
       所以该表达式等同于 (9 >= i_num) >= 1。当 9 >= i_num 为真时,则该表达式为
       1 >= 1,其值为真;当 9 >= i_num 为假时,则该表达式为 0 >= 1,其值为假。

    4. i_num < -9 || i_num > 9

        只要 i_num < -9 和 i_num > 9 当中有一个为真,该表达式的值就为真。

    5. if else if ... else if ... else

        也许您现在对 if else if ... else if ... else 这种用法仍然不太了解,觉得难以理解。
    不用担心,其实很简单,上面的代码我们可以改写成:

        if ( !i_num )    /* 效果等同于 i_num == 0 */
        {   /* 如果用户输入 0 */
            printf("i_num got a value of zero.\n");
        }
        else
        {
            if ( i_num >= 1 && i_num <= 9 )
            {   /* 如果用户输入介于 1 到 9 之间(包括 1 和 9)*/
                printf("i_num is between 1 and 9, inclusive.\n");
            }
            else
            {
                if ( i_num < -9 || i_num > 9 )
                {   /* 如果用户输入小于 -9 或者大于 9 */
                    printf("i_num is less than -9 or greater than 9.\n");
                }
                else
                {   /* 其它情况 */
                    printf("i_num is between -9 and -1, inclusive.\n");
                }
            }
        }

    怎么样,是不是容易理解多了?不过,习惯上,我们会采用前一种写法。其实,如果你习惯了
    前一种写法,会觉得前一种写法更容易理解。if else if ... else 的基本结构为:

        if ( condition1 )
            一条语句/复合语句
        else if ( condition2 )
            一条语句/复合语句
        else if ( condition3 )
            一条语句/复合语句
        ... ...
        else if ( conditionN )
            一条语句/复合语句
        else
            一条语句/复合语句

    其执行流程如下图所示:

    从这个图中我们可以清楚地看出,当条件为假时,程序会跳到下一条 if 语句,直到条件成立
    为止。当某个 if 语句的条件为真时,则执行其下的“一条语句/复合语句”,然后退出整个
    if else if ... else 结构,转而执行后续语句(本例是执行 return 0;)。如果没有一个
    条件为真,则执行最后那个 else 后面的“一条语句/复合语句”,然后继续执行后续语句
   (本例是执行 return 0;)。

下面我们来总结一下这三个运算符的作用(exp 代表表达式):
 
    exp1 && exp2:当 exp1 和 exp2 同时为真时,exp1 && exp2 为真。

    exp1 || exp2:只要 exp1 和 exp2 当中有一个为真,则 exp1 || exp2 为真。
                  当然,exp1 和 exp2 同时为真时,exp1 || exp2 也为真。

    !exp1:如果 exp1 为假,则 !exp1 为真;如果 exp1 为真,则 !exp2 为假。

例如:

    2 > 5 && 1 > 0 为假,因为 2 > 5 为假。
 
    1 > 2 || 4 < 8 为真,因为 4 < 8 为真。
 
    !(2 < 5) 为假,因为 2 < 5 为真。
 

二、逻辑运算符的优先级

    && 的优先级比 || 高。它们俩的优先级都低于关系运算符,高于赋值运算符。! 的优先级非常高,比乘除运算符的优先级还要高,和自增自减运算符(前置时)的优先级一样高。例如:

        a > b && b > c || b > d

等同于

        ((a > b) && (b > c)) || (b > d)

如果您不想记住优先级的高低关系,完全没问题,可以不记。反正对于不确定的地方,加上括号就万无一失了。使用括号是非常好的编程风格,这样就算代码的读者不太了解运算符的优先级,也可以看明白。


三、逻辑运算符的求值顺序

    C 规定先对 && 或 || 左边的操作数进行运算,然后再对其右边的操作数进行运算。&& 和 || 都是序列点。如果 && 左边的表达式为假,则不再对其右边的表达式求值。只有当 && 左边的表达式为真时,才会对其右边的表达式求值。而对于 ||,如果其左边的表达式为真,则不再对其右边的表达式求值。只有当 || 左边的表达式为假时,才会对其右边的表达式求值。例如:

    1 != 1 && 2 == 2    // 不会对 2 == 2 求值,因为 1 != 1 为假,故整个表达式为假
    1 == 1 && 2 == 2    // 左右两边都要求值,整个表达式为真
    1 == 1 || 2 == 2    // 不会对 2 == 2 求值,因为 1 == 1 为真,故整个表达式为真
    1 != 1 || 2 == 2    // 要对 2 == 2 求值,因为 1 != 1 为假。又因为 2 == 2 为真,
                        // 故整个表达式为真
    1 != 1 || 2 != 2    // 因为 1 != 1 和 2 != 2 都为假,故整个表达式为假

因为 && 和 || 都是序列点,所以使用任何符合标准的 C 编译器编译以下表达式的效果都是一样的:

    i++ != 20 && (i + j != 30)  // 在对 i + j != 30 求值之前,i 的值就已经自增了
    i++ != 20 || (i + j != 30)  // 在对 i + j != 30 求值之前,i 的值就已经自增了


四、iso646.h

    考虑到某些计算机可能不支持输入 !、| 和 & 这三个字符(如键盘中没有这三个键),C99 新增了头文件 iso646.h,用于解决这个问题。包含这个头文件之后,我们就可以用 and 来代替 &&,用 or 来代替 ||,用 not 来代替 !。我们可以把上面的程序改成这样:

        /*--------------------------------------------------------------
         | 作者: Antigloss @ http://stdcpp.cn @ 蚂蚁的 C/C++ 标准编程
         | 
         | 功能: 演示 and、or 及 not 的用法
          -------------------------------------------------------------*/

        #include <stdio.h>
        #include <iso646.h>

        int main(void)
        {
            int i_num;

            printf("Please enter an integer: ");
            scanf("%d", &i_num);

            if ( not i_num )    /* 效果等同于 i_num == 0 */
            {   /* 如果用户输入 0 */
                printf("i_num got a value of zero.\n");
            }
            else if ( i_num >= 1 and i_num <= 9 )
            {   /* 如果用户输入介于 1 到 9 之间(包括 1 和 9)*/
                printf("i_num is between 1 and 9, inclusive.\n");
            }
            else if ( i_num < -9 or i_num > 9 )
            {   /* 如果用户输入小于 -9 或者大于 9 */
                printf("i_num is less than -9 or greater than 9.\n");
            }
            else
            {   /* 其它情况 */
                printf("i_num is between -9 and -1, inclusive.\n");
            }

            return 0;
        }

参考资料:C Primer 5th Edition

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C 语言运算符
巧用异或交换整型变量的值
51. 条件运算符(?:)

上一篇:48. 在循环中使用 if 语句
下一篇:50. if 语句嵌套

共有评论 0 条 网友评分 3分 查看全部评论

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss