C复习手记(Day3)
C预处理器
C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。 所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。下面列出了所有重要的预处理器指令:
指令 | 描述 |
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,返回真 |
#ifndef | 如果宏没有定义,返回真 |
#if | 如果给定条件为真,则编译下面的代码 |
#else | #if的替代方案 |
#elif | 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 |
#errror | 遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
#endif | 结束一个#if….#else条件编译块 |
预定义宏
宏 | 描述 |
_DATE_ | 当前日期,一个以”MMM DD YYYY”格式表示的字符常量 |
_TIME_ | 当前时间,一个以格式”HH:MM;SS”表示的字符常量 |
_FILE_ | 包含当前文件名,一个字符串常量 |
_LINE_ | 包含当前行号,一个十进制常量 |
_STDC_ | 编译器以ANSI标准编译时,定义为1 |
预处理器运算符
C 预处理器提供了下列的运算符来帮助您创建宏
a、宏延续运算符(\):宏太长,单行容纳不了。ex:
#define message_for(a,b) \ printf(#a “and”#b “….”
b、字符串常量化运算符(#):把一个宏的参数转换为字符串常量ex
#include <stdio.h> #define message_for(a, b) \ |
c、标记粘贴运算符(##)
宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个记。
#include<stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) 编译运行结果:token34 = 40 |
d、defined()运算符
预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指 定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假。
参数化的宏
ex: #define MAX(x,y) ((x) > (y) ? (x) : (y))
函数直接调用MAX(x,y)即可。
C头文件
如果一个头文件被引用两次,编译器会处理两次头文件的内容,这将产生错误。为了防止这种情况,标准的做法是把文件的整个内容放在条件编译语句中。
#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif
有时需要从多个不同的头文件中选择一个引用到程序中。例如,需要指定在不同的操作系统上使用的配置参数。您可以通过一系列条件来实现这点
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
强转
整数提升:整数提升是指把小于 int 或 unsigned int 的整数类型转换为 int 或 unsigned int 的过程(Ascii码的转化)
常用的算术转换
常用的算术转换是隐式地把值强制转换为相同的类型。编译器首先执行整数提升,如果操作数类型不同,则它们会被转换为下列层次中出现的最高层次的类型:
常用的算术转换不适用于赋值运算符、逻辑运算符 && 和 ||
C复习手记(Day3)的更多相关文章
- C复习手记(Day4)
1.C错误处理 errno.perror() 和sterror() perror() 函数显示您传给它的字符串,后跟一个冒号.一个空格和当前 errno 值的文本表示形式. strerror() 函数 ...
- C复习手记(Day2)
1.共用体 共用体是一种特殊的结构,允许在相同的位置存储不同的数据类型.可以定义一个带有多成员的共同体,但是任何时候只能有一个成员带有值. 定义共用体: union Data { int i; flo ...
- C复习手记(Day1)
auto存储类:所有局部变量默认的存储类 ex:{int mount;auto int month} auto只用在函数内,只做局部变量 register 存储类:register 存储类用于定义 ...
- ROS学习手记 9 -- 阶段性复习
ROS 阶段性总结 1. 基本概念 ROS 是建立在Linux特别是Ubuntu系统上的一套软件系统,它具有操作系统的特征 ,负责管理各个模块的协同运行.设计初衷主要是面向机器人软硬件开发的特点:多 ...
- 复习JavaScript随手记
数据类型 基本类型 string number boolean undefined number类型,包含整数浮点数 NaN和自己都不相等,涉及NaN的计算结果都是NaN isNaN()函数用于判断一 ...
- Knockout.js随手记(2)
计算属性 konckout.js的API文档,写的极为详细和生动,透过MVVM的运作原理,开发时只需专注于定义ViewModel逻辑,不需耗费心力处理TextBox.Select的onchange.o ...
- Day3 /2-4.10!一天水完毕设,焦虑略减,flag不能倒!
PS:毕设略水,接下来两周要找到生活规律,竹径以后抓紧深化毕设(4.16开始),周六出去玩一天吧,这就需要明天把图彻底分好!!!明天有点小期待,今天把Day3补更完,明天原本应该是Day4的,但是打算 ...
- ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters
上一节完成了对nodes, Topic的理解,再深入一步: Services and Parameters 我不理解为何 ROS wiki 要把service与parameter放在一起介绍, 很想分 ...
- bjwc Day3 & 4 妈妈我这是来了个什么地方呀
真·bjwc开始了 Day3 T1啥啥啥 第k大斜率?想都没想码了个暴力,然后爆零...暴力都能错,退役 T2看着像网络流就扔了个网络流大暴力上去,六七十分的样子然后蜜汁wa T3题面说“想都没想就弄 ...
随机推荐
- 关于<%@ include file=" " %>与<jsp:include page=""></jsp:include>中的那些问题?
今天在使用<%@ include file=" " %>指令时,竟然在页面中不让使用?这是怎么回事:问题如下图: 顿时被这个问题给搞到了!!!突然想到在以前的 JSP ...
- gui界面2048小游戏
坑的地方 JLabel色块要调透明 方向键要用press方法 主界面 package game; import java.awt.BorderLayout; import java.awt.Event ...
- swing常用布局
1,FlowLayout 窗口的默认布局 设置窗口布局方法(下面不重复 setLayout(new FlowLayout()); 设置容器布局方法 比如容器 con1 con1.setLayout(n ...
- HAOI 硬币购物
试题描述: 现在一共有4种硬币,面值各不相同,分别为ci(i=1,2,3,4).某人去商店买东西,去了tot次,每次带di枚ci硬币,购买价值为si的货物.请问每次有多少种付款方法. 输入: 第一行包 ...
- javaScript的select元素和option的相关操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 使用padding-top实现自适应背景图片
在父级容器中设定最大的宽度,由于背景图片会出现塌陷的情况,有宽度无高度, 则,在图片容器中添加以下属性 padding-top:%(计算方式:图片的高度/图片的宽度*100%) background- ...
- PHP获取文件扩展名的多种方法
PHP获取文件扩展名的N种方法. 第1种方法: function get_extension($file) { substr(strrchr($file, '.'), 1): } 第2种方法: fun ...
- Python中else语句块(和if、while、for、try搭配使用)
学过C/C++的都知道,else语句是和if语句搭配使用的, 但是在Python中,else语句更像是作为一个模块,不仅仅可以和if语句搭配,还可以和循环语句,异常处理语句搭配使用.下面逐个进行介绍: ...
- vsftpd 访问 权限控制
vsftpd 重启命令 service vsftpd start|restart|stop vsftpd 关于权限控制,有两个文件分别设置,都会起作用 /etc/vsftpd/user_list / ...
- ASP.NET MVC5中的数据注解
ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...