运算符与表达式(续章)

位运算

    针对以bit为基本单位的运算
      &|^   ~
      
   移位运算
        << :逻辑运算:每个bit 依次左移  最高位丢弃  最低补0
        逻辑左移n位 ,相当于*2^n
        比乘法运算效率高很多
        >>:算数右移:每个bit依次右移  最低位丢弃   最高位补符号位
        算数右移n位  相当于/2^n
        比除法运算效率高很多
        取地址运算符和解引用运算符
             &:取变量的地址
                 &a
                 *,*&a取得a对应内存中的数据  等价于a

条件运算符(三目运算符)

  语法格式:D=条件表达式A?表达式B:表达式C;
  语义:如果A为真  D=表达式B
        如果A为假 D=表达式C

运算符优先级(先算谁后算谁)

       简单的看
                 int a = 2 + 5 * 3; 
  
                 int a = (2 + 5) * 3;
                 int a =  ((2 + 5) * 2) * 3; 
                 结论:()它的优先级是最高的,()中的内容一定先被计算,()容许嵌套使用
             详细的看
                       1)运算符之间是有优先级之分
      int b = 5 + a<<2;
   2)想先算的,搞不清优先级的 加()  万能方法
      int b = 5 + (a<<2);
   3)建议大概记忆优先级顺序,尽量记,记住多少算多少
      
      单目运算符>算数运算符>移位运算符>关系运算符>逻辑运算符>赋值运算符
      
      单目运算符:! ~ ++ -- &(取地址)
                  !a
                  
                  a + b (双目运算符)
      算数运算符:+ - * / %
      移位运算符: << >>
      关系运算符: > < ==  != >= <=
      逻辑运算符: && || !
      赋值运算符: =  += -=  *= /= %=

左右结合性(能掌握最好,不能就算了)

 左结合:
        m = a - b + c;// (a-b)+c
  右结合:
          int a = b = c;//a=(b=c)

数据类型的转换

  隐式转换
         特点:表达式中出现的数据类型不同,编译器会自动将不同的数据类型,转换成相同的数据类型,再做运算
         三种形式:
                    1)会将占内存 空间小的类型 转换成占内存空间大的类型
         int a = 0, c = 0;
         char b = 2;
         c = a + b; //将b类型由char类型提升为int类型 然后再做运算
      b) 运算时既有整型类型 又有浮点类型 
         编译器会自动将整型类型 转换为 浮点类型 再做运算
         printf("sizeof(1?1:0.9)的结果是%d\n", sizeof(1?1:0.9)); // 8
      c) 运算时既有无符号数据类型又有有符号数据类型
         编译器会自动将有符号类型转换为无符号类型 再做运算
         总结:
           1)规律:短转长  整转浮  有转无
           2)经验:尽量不要使用隐式转换
     强制转换
            1)强制转换的语法的格式
                      目标类型变量 = (目标类型)源类型变量
                      例如:
                               char a = 35;
                               int b = a;//隐式转换
                               int b = (int)a;//强制转换  先将a转换为字节数据  再去赋值给b
              2)注意强制转换可能造成数据丢失
                           int n = 300; /*0000 0000 0000 0000 0000 0001 0010 1100*/
     char m = (char)n;/*0010 1100*/
     printf("m=%hhd\n", m);//44  
                    长转短   不管是强制转换还是隐式转换  都会造成数据丢失  实际编程有时候就需要高位字节干掉
               3)不管是隐式转换还是强制转换都不会改变变量本身的值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值