• 【C语言】操作符与优先级详解


    C语言的操作符



    前言

    C语言的操作符运算,运算优先级,是否控制求值顺序,三个操作符主要的模块进行解释,同时会扩展隐式类型转换,整形提升,算术转换,同时也会有几道题目进行讲解


    一、算术操作符

    “加减乘除 取模” + - * / %

    1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
    2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
    3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

    二、移位操作符

    << 左移操作符
    >> 右移操作符
    注:移位操作符的操作数只能是整数。

    1. 左移规则:左边抛弃、右边补零
    2. 右移: 分为算数右移、逻辑右移
      逻辑移位
      左边用0填充,右边丢弃
      算术移位(只有算术移位才有符号规则)
      左边用原该值的符号位填充,右边丢弃

    警告⚠ :
    对于移位运算符,不要移动负数位,这个是标准未定义的。

    int num = 10;
    num>>-1;//error
    
    • 1
    • 2

    三、位操作符

    & //按位与
    | //按位或
    ^ //按位异或
    注:他们的操作数必须是整数。

    按位与: 两个位都为1时,结果才为1
    按位或: 两个位都为0时,结果才为0
    按位异或: 两个位相同为0,相异为1

    四、赋值操作符

    普通赋值运算符 =
    将右值赋值给左边的变量

    复合赋值运算符

    复合赋值运算符例子等于
    +=a+=ba = a + b
    -=a-=ba = a - b
    *=a*=ba = a * b
    /=a/=ba = a / b
    %=a%=ba = a % b
    >>=a>>=ba = a >> b
    <<=a<<=ba = a << b
    &=a&=ba = a & b
    |a=b
    ^=a^=ba = a ^ b

    五、单目操作符

    ! 逻辑反操作
    - 负值
    + 正值
    & 取地址
    sizeof 操作数的类型长度(以字节为单位)
    ~ 对一个数的二进制按位取反
    – 前置、后置–
    ++ 前置、后置++
    * 间接访问操作符(解引用操作符)
    (类型) 强制类型转换
    比特就业课 比特就业课-专注IT大学生就业的精品课程

    六、条件操作符

    > 大于
    >= 大于等于
    < 小于
    <= 小于等于
    != 用于测试“不相等”
    == 用于测试“相等”
    警告:
    在编程的过程中== 和=不小心写错,导致的错误。

    七、逻辑操作符

    && 逻辑与
    || 逻辑或

    八、条件操作符

    exp1 ? exp2 : exp3

    当exp1为true 返回exp2 否则返回exp3

    九、逗号表达式

    exp1, exp2, exp3, …expN
    从左往右依次执行。整个表达式返回最后一个表达式的结果

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

    1. [ ] 下标引用操作符
      操作数:一个数组名 + 一个索引值
    2. ( ) 函数调用操作符
      接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
    3. 访问一个结构的成员
      . 结构体.成员名
      -> 结构体指针->成员名

    十一、表达式求值

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

    11.1 隐式类型转换

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

    整型提升的意义:

    CPU整形运算器(ALU)的操作数字节长度为int的字节长度,同时也是CPU的 通用寄存器的长度
    只有小于int的才会整形提升

    如何进行整体提升呢?

    整形提升是按照变量的数据类型的符号位来提升的
    负数: 最高补符号位 为1
    正数 最高补符号位 为0

    算术运算操作的也是整形 算术操作符的操作都会整形提升在运算

    12.2 算术转换

    如果运算左右两个的类型不一致,就会发生转换 低转高

    long double
    double
    float
    unsigned long int
    long int
    unsigned int
    int

    警告:
    但是算术转换要合理,要不然会有一些潜在的问题。

    float f = 3.14;
    int num = f;//隐式转换,会有精度丢失
    
    • 1
    • 2

    12.2 操作符的属性

    复杂表达式的求值有三个影响的因素。

    1. 操作符的优先级
    2. 操作符的结合性
    3. 是否控制求值顺序。

    在这里插入图片描述
    在这里插入图片描述
    表达式要保证没有歧义,否则结果无法预测
    下面的表达式就有歧义,需要注意

    //代码3-非法表达式
    int main()
    {
     int i = 10;
     i = i-- - --i * ( i = -3 ) * i++ + ++i;
     printf("i = %d\n", i);
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    12.3 操作符的优先级

    1.聚组运算符[] ()
    2.单目运算符 . -> - ~ ++ – * & ! (类型) sizeof
    3.算术运算符 + - * /
    4. 移位运算符 << >>
    5. 比较运算符 > >= < <= == !=
    6. 位运算符 & ^ |
    7. 逻辑运算符 && ||
    8. 三目运算符(条件运算符) ?:
    9. 赋值运算符 = *= /= %= += -= <<= >>= &= ^= |=
    10.逗号运算符
    记忆方法: 先聚组 再单目 算术在前 接一下位 比一比位 逻辑 赋值紧跟其后 逗号垫底


    总结

    覆盖了C语言操作符的基本用法

  • 相关阅读:
    【JavaSE】类与对象
    【源码】JavaWeb+Mysql招聘管理系统 课设
    python 就是随便玩玩,生成gif图,生成汉字图片,超级简单
    mybatis代码自动生成插件
    Palantir大数据技术在乌克兰战场的应用
    杂谈-Android和Ios的对比
    MySQL 视图&变量
    vscode忽略某些文件
    FFmpeg编译参数分析
    事务隔离级别和MVCC
  • 原文地址:https://blog.csdn.net/HXY19/article/details/127891588