一.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\n"); 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 其他位并不会影响运算