美文网首页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