zoukankan      html  css  js  c++  java
  • 一些C语言基础知识

    位运算
    // 按位与&: 2 & 3 = 2; 010 & 011 = 010   两个1才为1
    // 按位或|: 2 | 3 = 3; 010 | 011 = 011   只要1个为1则为1
    // 按拉异或: 2 ^ 3 = 1;  010 | 011 = 001   不同则为1
     
    // 结合律:(a & b) & c = a & (b & c)
    // 交换律: a & b  = b & a
     
    /****************左移和右移注意点:****************
      左移运算符 <<                                 
         规则: 高位丢弃,低位补0                   
      右移运算符 >>                                 
         规则: 高位补符号位,低位丢弃              
     
    /*********************防错准则*********************
     避免位运算符,逻辑运算符和数学运算符同时出现在一个
     表达式中。(位运算优先级低于加减法运算)         
     需要同时参与运算时,尽量使用()来表达计算效仿次序
     
    // 小技巧:
    // 左移n位相当于乘以2的n次方
    // 右移n位相当于除以2的n次方
    // 位运算效率比数学运算高。
     
    #define SWAP3(a, b)
    {                  
        a = a ^ b;     
        b = a ^ b;     
        a = a ^ b;     
    }
    // 交换
    // a = (a ^ b)
    // b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a;
    // a = a ^ (a ^ b) = (a ^ a) ^ b = b;
     

     
    条件编译
    /**********************************************
     通过编译器命令行能够定义预处理器使用的宏     
     条件编译可以避免重复包含同一个头文件         
     条件编译是在工程开发中可以区别不同产品线的代码
     条件编译可以定义产品的发布版和调试版      
     

    sizeof
     sizeof是编译器的内置指示符,不是函数
     sizoof用于“计算”相应实体所占的内存大小
     sizeof的值在编译期就已经确定
       

    const
    const修饰的变量是只读的,其本质还是变量
    const修饰的变量会在内存占用空间
    本质上const只对编译器有用,在运行时无用
     
      const int* p;         // p可变,p指向的内容不可变
      int const* p;         // p可变,p指向的内容不可变
      int* const p;         // p不可变,p指向的内容可变
      const int* const p;   // p和p指向的内容不可变
     
      口诀: 左数右指
      当const出现在*号左边 时指针指向的数据为常量
      当const出现在*号后边时指针本身为常量
     
    * const修饰函数参数表示在函数体内不希望改变参数的值
    * const修饰函数返回值表示返回值不可改变,多用于返回指针的情形
     

     
    volatile
     
     可理解为“编译器指示字”
     volatile用于告诉编译器必须每次去内存中取变量值
     volatile主要修饰可能被多个线程访问的变量
     volatile也可以修饰可能被未知因素更改的变量
     
        int obj = 0;
        int a = 0;
        int b = 0;
     
        a = obj;
        sleep(100);
        b = obj;
        // 编译器在编译的时候发现obj没有被当成左值使用
        // 因此会“聪明”的直接将obj替换成10
        // 把a和b都直接赋值为10.
     
        // 可能出现的问题:在sleep(100)的时间内
        // 如果obj由于其它因素被修改,b的值被赋值为10。   
     
        // 解决方法:在obj之前加上volatile
     

     
    union
     
    struct中的每个域在内存中都独立分配空间
     union只分配最大域空间,所有域共享这个空间
     
     union的使用受系统大小端的影响(可通过union判断系统大小端)
     
    int checkSys()
    {
        union check
        {
            int i;
            char c;
        } cc;
        cc.i = 1;
        return cc.c == 1;  // 若等于1,则系统为小端模式,否则为大端模式
    }
     

    typedef
     
     typedef用于给一个已经存在的数据类型重命名
     typedef并没有产生新的类型
     typedef重定义的类型不能进行unsigned和signed扩展
     
    typedef和#define的区别 :
    typedef是给已有类型取别名              
    #define为简单的字符串替换,无别名的概念 
     

    enum
      enum是一种自定义类型
      enum默认常量在前一个值的基础上依次加1
      enum类型的变量只能取定义时的离散值
     
    ***********************枚举类型和#define的区别***********************
     #define宏常量只是简单的进行值替换, 枚举常量才是真 正意义上的常量                                    
     #define宏常量无法被调试,枚举常量可以             
     #define宏常量无类型信息,枚举常量一种特定类型的常量
     

     
    单引号和双引号
     
     本质上单引号括起来的一个字符代表整数
     双引号括起来的字符代表一个指针
     C编译器接受字符和字符串的比较,可意义是错误的
     C编译器允许字符串对字符变量赋值,其意义是可笑的。
     

     
     

     
     
  • 相关阅读:
    关内存地址的分配
    关于URL
    linux的8小时差问题解决
    关于Scanner类
    域名后缀
    匿名对象用法
    final修饰符,多态,抽象类,接口
    二维数组的传参
    关于随机数
    面向对象编程的三大基本特征
  • 原文地址:https://www.cnblogs.com/dddlion/p/3464765.html
Copyright © 2011-2022 走看看