操作符详解1-2

这篇博客详细介绍了C语言中的算术操作符,包括整数除法与浮点数运算,以及取模运算的注意事项。接着讲解了移位操作符,区分了算术右移与逻辑右移,并通过实例说明了编译器的处理方式。此外,还探讨了位操作符如按位与、按位或和按位异或的原理和应用,特别是利用异或交换两个整数的值。最后提到了赋值操作符、单目操作符如sizeof的使用及其陷阱,以及位操作中如何计数二进制中的1。
摘要由CSDN通过智能技术生成
  • 操作符
    • 操作符的分类

      • 算术操作符


        不难但是有细节
        + - * / %
        int a = 3/5 =0一个

        小数float = 6 /5 = 1.0000000;本质是1
        真的想得到小数
        ​至少有一个数是浮点数
        flaot = 6.0/5
        float =%f
        double =%lf
        flaot a = 6.0/ 5.0
        编译器会给出警告:
        因为你个直接给出6.0 和5.0默认是double类型
        你再用float会丢失精度
        怎么改?
        这种写法6666


        取模 int a = 7% 3 =1
        两边必须有整数
      • 移位操作符


        ****左移原则就是补0
        ​整形a四个字节===32个比特位 --32个二进制位



        右移分为两种:1.算术右移 规则右边丢弃,左边补原符号位
        2.逻辑右移补0

        在内存中存整数的二进制序列,第一个数符号位是0 1

        我们当前编译器采用的是逻辑还是算术,用-1
        int a = -1 ;
        int b = a >> 1
        ​知识:负数在内存中存放的是二进制的补码
        对于正整数,三码相同
        发现我们编译器用的是算术右移
        不是逻辑右移呀大哥,因为你是补码
        如果你是逻辑右移那补码就是01111111111111111111111
        反码就是011111111111111111110她的原码就是
        0000000000000000000001打印的是1
        但是打印的是-1


        同时右移左移后,对a没有发生改变
      • 位操作符(条件操作数必须是整数)


        & | ^
        & - 按(二进制)位与
        1和1才是1
        其他的都是0

        | - 按(二进制)位或
        有 1全1


        ^ - 按(二进制)位异或
        ​对应的二进制位进行异或
        规则是相同为0,相异为1




        用途:笔试题中
        交换两个int变量的值, 3和5变成5和3不能引用第三个变量
        数值太大,会溢出
        用异或
        ​算法的底层逻辑
        我们这样理解int a = 3;
        a ^ 0 ==
        011
        000
        011就是a
        a^0 = a
        a^a
        011
        011
        就是
        a^a=0
        完全符合相同为0
        0和任何异或为任何
        我们再来看
        a=a^b
        b=a^b
        也就是a^b^b这个结果就是a^0就是a
        这个时候b = a

        -1^-1是0
        • 练习:求一个整储存到内存中的二进制中1的个数
  • ^


    int a = 13
    0000000000000000001101
    如何让他变成0000000000000000011101
    a = a | (1<<4)
  • 赋值操作符


    笑死我
    连续赋值从右向左
    x = y +1
    a = x
     
    • 复合操作符
      += -= *= |=
      ​一个等号叫赋值,两个等号叫判断相等
  • 单目操作符(只有一个操作数)

    • !


      逻辑反操作
      if(flag)
      {
      printf()}
      if(!flag)
      flag为假,我们打印
    • - +
      a = -a;
    • sizeof(计算谁谁谁的大小)


      char arr [10] = {0};
      printf("%d",sizeof(a))计算a所占空间的大小,单位是字节
      444 error
      sizeof对于变量名可以省略括号,但是变量类型不行//证明sizof是操作符不是函数
      ​比较灵活

      • 计算数组大


        char类型 10
        int 类型 40
        int arr [10] = {0};
        sizeof(arr);
        sizeof(int [10]);这是数组类型(除了数组名都是数组类型)
        都是40
        题目:
        short s = 5;
        int a = 10;

        printf("%d",sizeof(s =a +2)
        printf("%d",s)
        2 5哈哈哈我知道
        short占两个字节
        s说了算
        s = int 类型的12
        你放到我这就要截断
        大的放到我这小的空间
        把多的东西去掉,保留有限位
        不会因为放12s的空间变大
        你放我这就得截断
        这个时候还是s说了算
        这里s = 5

        注意了,sizeof括号内的表达式不参与计算,算都不算

        还有test.c文件 >>>>test.exe
        源文件 可执行程序

        转换过程要经过编译 链接 运行
        但是s =a +2要运行要在运行期间才能运行
        但是sizeof计算s的大小,计算s = a +2的时候在编译器中进行
        我们处理sizof是在编译器进行的,所以表达式不会计算
        算都不算
    • ~对一个数二进制位按位取反


      -1
      10000000000000001原码
      11111111111111110反码
      11111111111111111补码
      int b = ~a对她的补码进行按位取反
      00000000000000000
      • 把a的二进制的第5位置成1


        把a的二进制的第五位置成0
        a | (1<<4)
        000000000000000000011101变成
        000000000000000000001101

        怎么做
        秒啊
    • ++ --前置后置


      后置++

      计算规则:先使用再++
      再使用,赋值给b,再自增
      最后一个坑你 10 9哈哈哈傻逼

      不建议你去深入i
      int b =(++a)+(++a)+(++a);
      在windows和linux里跑的不一样
      垃圾代码
      会让你从入门到放弃
      我们时间放到有限地方

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值