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处理文件常用的缓冲函数列表:
C 碎片九 预处理&位运算&文件操作的更多相关文章
- java位运算(操作)的使用
位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法 ...
- 位运算骚操作 Part 1
▶ 原文标题<Bit Twiddling Hacks>,地址:https://graphics.stanford.edu/~seander/bithacks.html ▶ 额外参考资料:h ...
- 位运算骚操作 Part 3
▶ 异或运算 "^" 具有的部分性质: ● 交换律,结合律 ● a ^ b == (!a & b) | (a & !b),a ^ 1 == !a,a ^ 0 == ...
- 位运算骚操作 Part 2
▶ 计算 unsigned int v 的以 2 为底的对数,结果放入 unsigned int r . // 方法零 #pragma unroll ;v; r++, v >>= ); / ...
- 位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
- 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...
- python学习之路-3 初始python数据类型以及文件操作
本篇涉及内容 set集合 函数 三元运算 文件操作 set集合 set是一个无序的且不重复的元素集合 1.创建set集合的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 全国计算机等级考试二级教程-C语言程序设计_第15章_位运算
位运算,不适用于实数,仅仅适用于整数.字符. C语言的位运算只能操作整数.字符,实数是指数方式表示的,不适用于位运算. #define _CRT_SECURE_NO_WARNINGS #include ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
随机推荐
- BadImageFormatException,未能加载正确的程序集XXX的解决办法
BadImageFormatException,未能加载正确的程序集XXX的解决办法 IDE:VS2010 语言:C# 异常:System.BadImageFormatException,未能加载正确 ...
- IPSec方案部署(多业务场景)
技术点详解—IPSec方案部署 通过前面几期的介绍可以发现IPSec所涉及的参数很多,在具体方案部署过程中有许多灵活选择的地方,本期专栏就专门对IPSec在几种典型环境中的方案部署进行介绍. 一. ...
- Angular11 模板表单、响应式表单(自定义验证器)、HTTP、表单元素双向绑定
1 模板表单 模型通过指令隐式创建 技巧01:需要在模块级别引入 FormsModule ,通常在共享模块中引入再导出,然后在需要用到 FormsModule 的模块中导入共享模块就可以啦 impor ...
- ASE分析
1.Prepare necessary input files(可以参考上次的博客http://www.cnblogs.com/renping/p/7391028.html) 1)对fq1和fq2合并 ...
- 【redis对象,集合序列化Demo】
package org.seckill.dao.cache; import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStr ...
- 【linux-./configure 配置文件时出错问题】
环境是:centos 5.6 安装系统时,可能安装的是标准的精简版本,所以没有选择软件依赖包,很多软件都没有安装. 现在需要安装软件,安装软件时报错: make: *** 没有指明目标并且找不到 ma ...
- Ubuntu 安装 samba 实现文件共享和source insight 阅读uboot
环境:win10 + 虚拟机Ubuntu 12.04 一. samba的安装: # sudo apt-get install samba # sudo apt-get install smbfs 二. ...
- PS2018学习笔记(30-35节)
30-35:万能的钢笔-制图抠图必学-part(1-6) # 本节知识点: 钢笔工具 贝塞尔曲线 绘图方式 光标状态认识 路径 形状 形状工具 矢量蒙版 # 本节段落表: 钢笔工具知识 直线绘制知识 ...
- C++的STL总结(1)
没有很系统的学过算法,c++也只是学些基础,虽然经常会用一些STL里面的函数,但是并没有对STL模板库有一个清晰的了解,趁着寒假有时间就自己在网上百度浏览别人的总结的内容,自己汇集并总结了一下,希望对 ...
- CodeForces 137C【贪心+优先队列】
这种区间的贪心好像都出"烂"了? 不过还是想写一下... 先按照区间左端点排序一下,然后搞个优先队列维护当前最小的右端点. #include <bits/stdc++.h&g ...