C 碎片九 预处理&位运算&文件操作

一、预处理

预处理语句:#开头的语句,在预处理阶段处理预处理语句。包括宏定义、文件包含处理、条件编译

 

1, 宏定义

1. 不带参数宏定义:#define 标识符  字符串

#define PI 3.1415926

 

2. 不带参数宏定义:#define 宏名(参数表)  字符串

//求两个数的较大值
#define MAX(a,b) a>b?a:b

//求两个数的较小值
#define MIN(a,b) a<b?a:b

 

3. 宏的说明:

  1. 实际上就是代码替换,不分配内存空间

  2. 宏定义必须要在同一行,使用行连接符 '\' 在预处理阶段表示把下一行代码和当前行连接成同一行

  3. 宏定义时,可以引用已定义的宏名,可以层层置换

  4. 可以用#undef命令终止宏定义的作用域

  5. 宏定义不必再行末加分号

  6. 宏一般用大写字母表示,多个大写字母中间用 '_' 作分割

 

4. 宏连接符 ## :用来将两个Token连接为一个Token,可以在一定程度上减少代码密度

#define COMMAND(NAME) { NAME, NAME ## _command }

COMMAND(help),
//表示 {help,help_command}

 

5. 变参宏...

#define myprintf(templt,...) fprintf(stderr,templt,__VA_ARGS__)
// 或者
#define myprintf(templt,args...) fprintf(stderr,templt,args)

说明:第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以用args来代指变参了

 

6. 宏(带参数的宏)和函数的区别

  1. 宏是编译时的概念,函数是运行时的概念

  2. 宏在编译时发生,运行速度较快;函数在运行时发生,运行速度较慢

  3. 宏不会对参数进行类型检查,函数有严格的类型检查

  4. 宏不分配存储单元,函数需要分配存储单元

  5. 宏会使代码体积变大,函数不会

  6. 宏不可以调用自身,函数可以(递归函数)

 

2, 文件包含处理

#include <文件名> //系统文件名
#include "文件名" //自定义文件名

说明:#include包含头文件/导入头文件,将另一个源文件中的内容包含进来,在预处理阶段展开。命令只能一个被包含文件,当有多个文件需要被包含的时候需要用到多个#include命令

 

3, 条件编译

一般情况下,源程序中所有源码都要参加编译,但是有时候希望程序中部分文件、源码满足一定条件才进行编译,可以对这一部分内容指定编译条件

1. 条件编译形式一

#if 表达式
    程序块 1
#else
    程序块 2
#endif

 

2. 条件编译形式二

#ifdef 标识符
    程序块 1
#else
    程序块 2
#endif

 

3. 条件编译形式三

#ifndef 标识符
    程序块 1
#else
    程序块 2
#endif

 

二、位运算

1, 位运算定义:两个二进制数中相应的位之间的运算

2, 位运算符:&、|、^、~、<<、>>等 

 

按位与&:可以对指定为清零。1相与 结果是本身;0相与 结果0

按位或|:可以使指定位置为1。1相或 结果是1;0相或 结果是本身

按位异或^:相同0,不同1;1异或 结果取反,0异或 结果不变

 

按位取反~:对一个数取反结果是 这个数的相反数再减1。~3 <--> -2

左移<<:高位舍去 低位补0

右移>>:

  有符号数:低位舍去,最高位(符号位) 是什么那么就补什么

  无符号数:低位舍去,高位都是补0

 

3,  位运算相关宏

1. 将num的第n位清零

 #define CLEAR_BIT(num,n)  num &= ~(1<<n)

2. 将num的第n位置1

 #define SET_BIT(num,n) num |= 1<<n

3. 将num的第n位取反

 #define OPP_BIT(num,n)  num ^= 1<<n

 

三、文件操作

文件定义:一般指储存在外部介质上数据的集合,数据是以文件的形式储存的,操作系统以文件为单位对数据进行管理。

缓冲区:所有文件有一个缓冲区。从操作系统来看,每一个输入输出设备都可以看做文件,键盘可以看做输入文件,显示屏可以看做输出文件。

在以下情况才会把printf缓冲区的内容输出到屏幕:

  1. 缓冲区满了

  2. 遇到了换行符

  3. 遇到了scanf函数

  4. 遇到fflush(stdout); //刷新流,刷新标准输出

 

C对文件的处理一般采用缓冲文件系统,如图:

C处理文件常用的缓冲函数列表:

 

posted on 2016-06-21 16:14  流浪_先生  阅读(383)  评论(0编辑  收藏  举报

导航