• C语言 -- 操作符详解


    本节重点:

    1. 各种操作符的介绍
    2. 表达式求值

    操作符分类:

    • 算术操作符   +   -   *   /  %

    /    两边若都为整数,则得到的也为整数;两边有一个为小数,得到的即为小数。

    %  操作符的两个操作数必须为整数,返回的是整除之后的余数。

    • 移位操作符
    1. #include
    2. #include
    3. // >> 右移操作符
    4. // << 左移操作符
    5. // 移动的为二进制位
    6. int main()
    7. {
    8. int a = 16;
    9. // 16的二进制0001 0000
    10. int b = a >> 1;
    11. printf("%d\n", a);
    12. printf("%d\n", b);
    13. return 0;
    14. }
    15. /*
    16. 右移操作符:
    17. 1.算术右移
    18. 右边丢弃,左边补原符号位;
    19. 2.逻辑右移
    20. 右边丢弃,左边补0
    21. */

    整数的二进制表示有 :原码、反码、补码,存储到内存的是补码

    • 位操作符

    &         按位与       

    |          按位或

    ^        按位异或

    注:他们的操作数必须是整数

    练习:交换两个变量的值,不使用中间变量

    1. #include
    2. #include
    3. int main()
    4. {
    5. int a = 3;
    6. int b = 5;
    7. // 加减法
    8. a = a + b;
    9. b = a - b;
    10. a = a - b;
    11. printf("after : a = %d b = %d\n", a, b);
    12. return 0;
    13. }

    练习:求一个整数存储在内存中的二进制中1的个数

    1. #include
    2. int main()
    3. {
    4. int num = 0;
    5. scanf("%d",&num);
    6. // 统计num的补码中有几个1
    7. int count = 0; // 计数
    8. while (num)
    9. {
    10. if (num % 2 == 1)
    11. count++;
    12. num = num / 2;
    13. }
    14. printf("二进制中1的个数 = %d\n", count);
    15. return 0;
    16. }
    • 赋值操作符

    变量在创建时给它一个值,叫做初始化,之后叫赋值

    • 单目操作符

    单目操作符,只有一个操作数,例如!

    双目操作符,两个操作数

    &a    取地址操作符,一般与指针结合使用

    *p        解引用操作符

    *p  = &a 

    1. // 变量的赋值与使用
    2. int a = 10;
    3. int *p_a = &a;
    4. *p_a = 20;

     sizeof计算的变量是所占内存空间的大小,单位是字节

    int         4个字节

    char        1个字节

    1. #include
    2. int main()
    3. {
    4. short s = 0;
    5. int a = 10;
    6. printf("%d\n",sizeof(s = a+5)); // s为short,2个字节
    7. printf("%d\n",s); // sizeof 不参与运算,只计算空间的大小
    8. return 0;
    9. }

    ++a        前置++,先++,后使用

    a++        后置++,先使用,再++

    强制类型转换

    1. int a = (int)3.14 //正确用法
    2. int a = int(3.14) //错误用法
    • 关系操作符

    • 逻辑操作符

    &&   注:只要左边结果为假,右边不管结果是什么都不再计算

    1. int i = 0,a=0,b=2,c=3,d=4;
    2. i = a++ && ++b && d++
    3. printf("a = %d\n b= %d\n c=%d\n d = %d\n",a,b,c,d);
    4. // 输出结果 1 2 3 4

    ||     只要左边为真,右边就不需要计算了

    • 条件操作符
    • 逗号操作符

    逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

    • 下标引用、函数调用和结构成员

    下标引用操作符:一个数组名+一个索引值

    函数调用操作符(),接受一个或多个操作数;第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

    访问一个结构成员(重要)

    结构体变量.成员名

    1. #include
    2. // 学生
    3. // 创建一个结构体类型
    4. struct stu{
    5. char name[20];
    6. int age;
    7. char id[20];
    8. };
    9. // 结构体对象s1,并初始化,实例化
    10. struct stu s1 = {"张三",20,"20131532"};
    11. int main()
    12. {
    13. printf("%s\n",s1.name);
    14. printf("%d\n",s1.age);
    15. printf("%s\n",s1.id);
    16. return 0;
    17. }

    结构体指针->成员名

    1. #include
    2. // 学生
    3. // 创建一个结构体类型
    4. struct stu{
    5. char name[20];
    6. int age;
    7. char id[20];
    8. };
    9. // 结构体对象s1,并初始化,实例化
    10. struct stu s1 = {"张三",20,"20131532"};
    11. struct stu *ps = &s1; // 结构体指针
    12. int main()
    13. {
    14. printf("%s\n",ps->name);
    15. printf("%d\n",ps->age);
    16. printf("%s\n",ps->id);
    17. //以下效果相同
    18. printf("%s\n",(*ps).name);
    19. printf("%d\n",(*ps).age);
    20. printf("%s\n",(*ps).id);
    21. return 0;
    22. }

    表达式求值

    表达式求值的顺序一部分是由操作符的优先级和结合性决定,同样有些表达式的操作数在求值的过程中可能需要转换为其他类型。

    隐式类型转换

    C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

    整型提升是按照变量的数据类型的符号位来提升的

  • 相关阅读:
    Gee引擎常用功能简介
    正态分布,二维正态分布,卡方分布,学生t分布——概率分布学习 python
    Go语言的断点续传
    ROS从入门到精通(八) 常用传感器与消息数据
    【PyTorch】切记:GeForce RTX 3090 显卡仅支持 CUDA 11 以上的版本!
    【2022 Twitter爬虫高级搜索接口分析及代码编写 Python爬虫 附主要代码及解析】
    两个对象相等(==、equals、hashCode)详解
    力扣刷题-数组-螺旋矩阵
    137页Python学习笔记,全面总结看这一篇就够了
    【基于python+Django的有机食品推荐系统-哔哩哔哩】 https://b23.tv/lqRcF1y
  • 原文地址:https://blog.csdn.net/qq_45355603/article/details/126067726