美文网首页C语言学习天花板C语言
C语言从零开始(七)-其他运算符

C语言从零开始(七)-其他运算符

作者: 天花板 | 来源:发表于2015-11-04 22:09 被阅读2989次

    一,关系运算符

    1. 关系运算符

    关系运算符的作用是比较符号两边的元素

    > 大于
    >= 大于等于
    < 小于
    <= 小于等于
    == 等于
    != 不等于

    关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。也就是说,在一个没有括号的关系运算表达式中,<、<=、>、>=要先于==和!=发挥作用。相同级别的预算符从左向右计算。

    2. 关系表达式

    关系表达式的一般形式为:

    表达式  关系运算符  表达式
    

    例如:

    a + b > c - d
    x > 3 / 2
    ‘a’ + 1 < c
    -i - 5 * j == k + 1
    

    也允许出现嵌套的情况。

    例如:

    a > (b > c)
    a != (c == d)
    

    关系表达式的值是“真”和“假”,用“1”和“0”表示。如:
    5 > 0的值为“真”,即为1;
    (a = 3) > (b = 5)由于不成立,故其值为假,即为0。

    例如:

    #include <stdio.h>
    
    int main(){
    
        char c = 'k';
        int i = 1, j = 2, k = 3;
        float x = 3e + 5, y = 0.85;
    
        printf("%d, %d\n", 'a' + 5 < c, -i - 2 * j >= k + 1);
        printf("%d, %d\n", 1 < j < 5, x - 5.25 <= x + y);
        printf("%d, %d\n", i + j + k == -2 * j, k == j == i + 5);
    
        return 0;
    }
    
    • 字符变量以它对应的ASCII码参与运算
    • 对于含多个关系运算符的表达式,如k == j == i + 5,根据运算符的左结合性,先计算k == j,该式不成立,其值为0,再计算0 == i + 5,也不成立,故表达式值为0。

    是不是有点晕,如果你要参加考试,请仔细研究一下。如果你只是为了能自己写出好的程序,不用搞懂这么多,值需要知道:

    表达式为真,值为1。表达式为假,值为0
    

    需要注意的是,C语言中经常用0代表假,非零代表真。遇到了我们再说。

    二,逻辑运算符

    逻辑运算符相当于数学中的(且、或、非),我们叫做“逻辑与”、“逻辑或”和“逻辑非”。

    && 逻辑与
    || 逻辑或
    ! 逻辑非
    

    前两个是双目运算符,最后一个是单目预算符。

    我们看一段代码:

    int main()
    {
        int a = 5 > 3; // 表示真
        int b = 5 < 3; // 表示假
    
        int x = a && a;
        int y = a && b;
        int z = b && b;
        printf("x = %d, y = %d, z = %d\n", x, y, z);
    
        x = a || a;
        y = a || b;
        z = b || b;
        printf("x = %d, y = %d, z = %d\n", x, y, z);
    
        x = !a;
        y = !b;
        z = !(!a);
        printf("x = %d, y = %d, z = %d\n", x, y, z);
    
        return 0;
    }
    

    先看下这段代码的运行结果:

    运行结果

    简单说就是这样:

    逻辑与:两边都为真时返回真,否则返回假;
    逻辑或:只要任意一个为真就返回真,否则返回假;
    逻辑非:符号右边是真,则返回假;符号右边是假,则返回真。

    请仔细对照程序理解。

    三,按位运算符

    C语言和其它高级语言不同的是它完全支持按位运算符。这与汇编语言的位操作有些相似。

    按位运算符有:

    & 位逻辑与
    | 位逻辑或
    ^ 位逻辑异或
    - 位逻辑反
    >> 右移
    << 左移
    

    这部分涉及一点点汇编语言知识,不具体介绍了。有问题的同学可以私下讨论。

    需要说几个特殊的应用。

    1. 不申请第三个变量数值交换

    这个问题经常在面试中考,就是如何在不使用第三个变量的情况下完成两个变量的数值交换。看这段代码:

    int a = 1;
    int b = 2;
    
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    
    printf("a = %d, b = %d\n", a, b);
    

    大家自己去验证一下结果。

    2. 最高效的乘2和除2

    int a = 10;
    int b = a * 2;
    int c = a / 2;
    
    printf("b = %d, c = %d\n", b, c);
    

    这段代码大家肯定能看懂,但它还有另外一种效率更高的表达方式:

    int a = 10;
    int b = a << 1;
    int c = a >> 1;
    
    printf("b = %d, c = %d\n", b, c);
    

    因为位运算得到了更多的底层优化,因此同样的功能它的效率更高。在嵌入式开发中,这种方式是被人们推崇的,因为资源有限。其他领域,人们更多地还是使用前面的方法,因为代码可读性更佳。

    说远了,这些大家了解就好。

    四. 特殊运算符

    1. "?"运算符

    "?"运算符是一个三目运算符, 其一般形式是:

    <表达式1>?<表达式2>:<表达式3>;
    

    含义:

    先求表达式1的值,如果为真,则求表达式2 的值并把它作为整个表达式的值;如果表达式1的值为假,则求表达式3的值并把它作为整个表达式的值。

    请看下面这段代码:

    int main()
    {
        int x, y, z;
        x = 50;
        y = x > 70 ? 100 : 0;
        printf("y = %d\n", y);
    
        x = 80;
        z = x > 70 ? 100 :0;
        printf("z = %d\n", z);
    
        return 0;
    }
    

    运行结果为:

    运行结果

    仔细思考一下这个例子。后面我们会讲到的if ... else ... 的部分功能可以用这个表达式替代。

    2. ","运算符

    ","运算符用于将多个表达式串在一起, ","运算符的左边总不返回,右边表达式的值才是整个表达式的值。

    举个例子:

    int main()
    {
        int x, y;
        x = 50;
        y = (x -= 5, x / 5);
    
        printf("%d", y);
    
        return 0;
    }
    

    这段代码的打印结果是9. 因为x的初始值为50, 减5后变为45, 45除5为9赋给y。

    这个知识点常被忽略,所以被各种考试青睐。其实在真正编程中很少使用。

    3. sizeof运算符

    sizeof运算符是一个单目运算符, 它返回变量或类型的字节长度。

    例如:

    sizeof(double) // 8
    sizeof(int) // 2
    

    也可以求变量的大小, 例如:

    float f;
    int a = sizeof(f);
    

    则a的值将为4。

    这个预算付可以理解为一个函数,在计算结构体大小时很有用。后面会讲到。

    五,C运算符的优先级

    当一个表达式中有多个运算符参加运算时,将按下表所规定的优先级进行运算。表中优先级从上往下逐渐降低,同一行优先级相同。

    C运算符的优先次序(1最高, 16最低)

    1. ()(小括号) [](数组下标) .(结构成员) ->(指针型结构成员)
    2. !(逻辑非) .(位取反) -(负号) ++(加1) --(减1) &(变量地址)
    3. *(指针所指内容) type(函数说明) sizeof(长度计算)
    4. *(乘) /(除) %(取模)
    5. +(加) -(减)
    6. <<(位左移) >>(位右移)
    7. <(小于) <=(小于等于) >(大于) >=(大于等于)
    8. ==(等于) !=(不等于)
    9. &(位与)
    10. ^(位异或)
    11. |(位或)
    12. &&(逻辑与)
    13. ||(逻辑或)
    14. ?:(?表达式)
    15. = += -=(联合操作)
    16. ,(逗号运算符)

    这个部分教材上有大量练习题,请大家去练习一下。尤其是准备考等级考试的同学。

    今天就到这里。其实这部分如果细说还有很多小点,我们这里主要抓取大的脉络,具体还需要大家学习教材,有什么问题欢迎探讨。

    我是天花板,让我们一起在软件开发中自我迭代。
    如有任何问题,欢迎与我联系。


    上一篇:C语言从零开始(六)-运算符与类型转换
    下一篇:C语言从零开始(八)-标准输入输出

    相关文章

      网友评论

      • 405bacfe89d3:大佬,我用code::blocks编译你那段
        int main(){

        char c = 'k';
        int i = 1, j = 2, k = 3;
        float x = 3e + 5, y = 0.85;

        printf("%d, %d\n", 'a' + 5 < c, -i - 2 * j >= k + 1);
        printf("%d, %d\n", 1 < j < 5, x - 5.25 <= x + y);
        printf("%d, %d\n", i + j + k == -2 * j, k == j == i + 5);

        return 0;
        }
        提示float x = 3e + 5那有错误
        |error: exponent has no digits|
        但把e改成数字之后就可以了
        新人不是很懂是什么原因(编译器不同造成的?)能解释一下吗
        暗叫不好:@YA104 我觉得不能整成3e得是3*e
      • 2a17e4f20006:Int b = a<<1是什么意思
        天花板: @SunshineCindy 左移一位
      • 2a17e4f20006:位运算什么时候会用到
        2a17e4f20006:@天花板 谢谢啦!
        天花板: @SunshineCindy 在需要非常节省地使用内存的时候用。比如嵌入式开发。
      • 加纳利:今天双11啊,这个设定合理不?
        int main()
        {
        int x, y, z;
        x = 520;
        y = x > 1111 ? 1314 : 88;
        printf("y = %d\n", y);

        x = 1314;
        z = x > 1111 ? 520 :88;
        printf("z = %d\n", z);

        return 0;
        }
        Choco_xuan:@加纳利 88
        520
        天花板:@加纳利 语法正确
      • 4ed6afef78f9:怎么这几天不更了 我还等着看呢
      • c5e50bfa0318: @Vivin 😊我毕业两年了,本专业学艺术设计的,现在想学编程
        天花板:@_海曦 从读教材开始吧。遇到具体问题欢迎邮件沟通
      • c5e50bfa0318:25岁了,想重新开始人生,学这个会不会有些晚呢
        a1872a65346b:@_海曦 25啦 大三党 上学期学的C语言……
        天花板:@_海曦 什么时候学都不晚,不过要想靠它改变自己的人生需要下大工夫。希望你有心理准备
        fa3a79e1f08f:@_海曦 早上刚在微博看到一个关于30岁是否还能学习编程的回答:种一棵树最好的时间是十年前,其次是现在。加油

      本文标题:C语言从零开始(七)-其他运算符

      本文链接:https://www.haomeiwen.com/subject/sktchttx.html