[c语言基础回顾]操作符和表达式中一些极其容易混淆的知识点

易错知识回顾

一.区分按位操作和逻辑操作

  • &是将数在内存中以二进制补码形式按位进行”与”操作
  • &&是逻辑上的”与”操作
    12的二进制数是1100 2 的二进制是0010
    12&2结果为0;
    12&&2结果为1;

二. 位移操作

1. 基本知识

  • 左移
    • 二进制左移N位=*(2^n);
    • 逻辑左移=算数左移,右边统一添0
  • 右移
    • 二进制右移N位=/(2^n);
    • 逻辑右移,左边统一添0
    • 算数右移,左边添加的数和符号有关
    • 编程默认采用算术右移

2. 一个经典的算法

求一个数二进制补码中1和0的个数

int binaryCount(int Num)
{
    int count = 0;
    while (Num)
    {
        Num = Num&(Num - 1);//减一操作是把最右边第一个1还有之后的0(如果有)取反,之后用与操作置零
                count1++;
    }
    return count;
}
//求二进制 中0 的个数 
 while (num + 1)  
    {  
        num |= (num + 1);  // 将最右边的0和之后的1(如果有)取反,用或操作置1,直到溢出变为全零
          count++; 
    }  
    return count;  
}  

掌握一种 总位数减去另外一中即可.

三.szie of重要知识点

  • size of是一个单操作符,并不是一个函数;
  • 数组中sizeof(array)和sizeof(&arry)区别

    • 当在函数中 初始化之后计算长度的时候

      • sizeof(array)是指整个数组的字长
      • sizeof(&arry)是取一个指针的字长
    • 当作为参数传参的时候

      • sizeof(array)和sizeof(&arry)都作为指针
        这里写图片描述
    • sizeof(表达式) 表达式中的值并不进行计算,(size of 在编译时候执行,此时表达式的值未确定但是类型已经确定)

    四.结构体中一个常犯的错误

    这里写图片描述
    这里是因为数组是不能直接赋值的,数组的名字就是个常量指针
    这里相当于

    int arr[3]={1,2,3,4};
    arr=3;
    0x002233=123;
    5=3;

    解决方法很简单了
    这里写图片描述
    其实一般的解决方式是利用strcpy函数

    这里写图片描述

    五. &(取地址符)对于数组的不同之处

    我们知道一个数组初始化的时候数组名就是一个指向第一个元素的指针常量

    int arr[3];
    printf("%p",arr);//打印的是数组第一个元素的地址
    printf(("%p",&arr);//打印的是整个数组的首地址

    这两个结果是一样的,但是在加一操作后就不一样了

    int arr[3] = {1,3,2};
    printf("%p\n", arr);
    printf("arr加一的结果是%p\n", arr+1);
    printf("%p\n", &arr);
    printf("&arr加一的结果是%p\n", &arr+1);

    这里写图片描述
    可以看到arr+1是下一个元素.&arr+1就直接跳过整个数组了(数组长度是12)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值