• <C> typedef 宏 const 位运算


    一.typedef

    1.作用:

    给已经有的数据类型起别名 并不是定义了新的数据类型

    2.位置:

    在主函数之前

    例如:typedef int AA; //AA就是int

    了解:typedef unsigned int UNIT; 这行命令在C的状态下 有这行代码才可以使用UNIT来定义一个变量

    但是如果加上头文件#include<windows.h> UNIT就可以直接使用

    二.宏(广泛使用)

    1.提出:程序编译的四个过程?

    ①预处理:引入头文件 加载宏

    ②编译:检查词法(即单词是否打错) 语法(即标点符号 流程结构) 语义

    注:这个过程是不对逻辑进行检查的 通过检查后转换成汇编码

    ③汇编:转化成机器码

    ④链接:把代码连接到可执行文件

    2.宏的定义:以“#”开头的代码 都是预处理代码

    3.组成:#宏的语法 + 宏的名字 + 宏的内容

    注:宏是很单纯的东西 它的作用就是单纯的替换 宏的名字一般都是大写字母

    例:

    1 #define AA int a = 10

    一般都不加分号 但是也可以加 加了容易报错

    4.位置:在主函数之前

    来一个耍宝例题:如何不用循环就输出1000个“Hello World”呢?(其实现实生活中没有这么用的 仅供娱乐)

     1 #include<stdio.h>
     2 
     3 #define A printf("Hello World
    ");
     4 #define B A A A A A A A A A A 
     5 #define C B B B B B B B B B B
     6 #define D C C C C C C C C C C
     7 
     8 int main()
     9 {
    10     D
    11 }

    5.有参数的宏

    例如:#define ADD(a,b) a+b !!!如果你这样写就大错特错了

    上面的那条语句在执行 ADD(1,2)*5的时候 输出的结果 是11

    正确的写法应该是:#define ADD(a,b) (a+b)

    那么乘法就应该是:#define MUL(a,b) ((a)*(b))

    主要注意的是:在定义宏的时候 参数之间是不冲突的 只局限于定义的那一行

    比较大小的宏:#define MAX(a,b) ((a)>(b)) ? 1 : 0 //大于的话 输出返回1 否则为0

    这里要注意括号 要熟悉运算符优先级

    6.宏的应用:

    这个需要联系的数组后面讲的冒泡排序 这个在这篇的后面写

    三.const

    1.定义:在C语言中 const叫“只读变量” 在C++中叫“常量”

    注:const修饰的变量必须初始化 在C语言中是可以改的 但是需要方法

    例如:

    1 const int a = 10;

    2.位置:可以放在int的前面 也可以放在int的后面

    了解(修改方法):

    1 int* p = (int* ) &a;
    2 * p = 100;

    3.总结:

    const在*的左边时 *p不能改 p可以改

    const在*的右边时 *p可以改 p不能改

    *两边都有const的时候 *p和p都不能改 即:int const * const p = &a;

    但是a可以改 只是不能通过指针来修改内存了

    四.位运算

    1.引入:

    在内存中 所有存储存的都是二进制 都是补码

    正数:原码 = 反码 = 补码

    负数:例:原码 1000 0001 (char b = -1;)

    反码1111 1110 //符号位不变 其余的取反

    补码 1111 1111 //补码 = 反码 + 1

    2.位运算的类型:

    ①与运算 &:都是1为1 其余的都是0

    例如:1 & 2 结果为0

    ②或运算 |:有1就是1

    例如:1 | 2 结果为3(用二进制算)

    ③取反(单目运算符) ~:1变0 0变1

    ④异或 ^:相同为1 不同为0

    ⑤右移 >>:

    例如:1 >> 2 结果为0(看二进制)

    ⑥左移:

    例如:1 << 2 结果为4(看二进制)

    注:左移和右移的时候 操作的都是补码 补符号位 移动几位就补几个0

    3.位运算的应用:

    话不多说 直接上例题:我们要找对象 定义一个人的条件 性别 身高 体重 带不带眼镜 正常来说需要四个变量

    但是我们相用一个变量就解决 我们应该如何解决这个问题呢?

     1 #include<stdio.h>
     2 
     3 #define SEX 1 //0 男 1 女
     4 #define HIGH 2 //0 高 1 矮
     5 #define WEIGHT 4 //0 胖 1 瘦
     6 #define GLASS 8 //0 不带 1 带
     7 
     8 int main()
     9 {
    10     char style = 0 | GLASS;
    11 
    12     if(style & SEX)
    13     {
    14         printf("女的 ");
    15     }
    16     else
    17     {
    18         printf("男的 ");
    19     }
    20 
    21     if(style & HIGH)
    22     {
    23         printf("矮的 ");
    24     }
    25     else
    26     {
    27         printf("高的 ");
    28     }
    29 
    30     if(style & WEIGHT)
    31     {
    32         printf("瘦的 ");
    33     }
    34     else
    35     {
    36         printf("胖的 ");
    37     }
    38 
    39     if(style & GLASS)
    40     {
    41         printf("带眼镜的 ");
    42     }
    43     else
    44     {
    45         printf("不带眼镜的 ");
    46     }
    47 }

    输出结果为:男的 高的 胖的 带眼镜的

    注:我们定义了一个char类型的变量 char一个字节 八位 我们可以把每位都看成不同的条件

    每位或上1 就可以控制其条件 在判断的过程中 如代码中的style | GLASS

    SEX:0000 0001 不是0就是1 所以在进行&运算的时候 同为1的为1 其他位并不会影响运算 

  • 相关阅读:
    每日一练4
    每日一练3
    每日一练2 字符串逆序输出
    每日一练1
    python全局变量
    python __file__ 与argv[0]
    python 静态方法和类方法
    常用的python库(不断更新)
    django 自定义用户user模型的三种方法
    实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
  • 原文地址:https://www.cnblogs.com/Aaaaaalei0612/p/8687068.html
Copyright © 2020-2023  润新知