预处理还需要运算符?有没有搞错?

^_^, 没有搞错,预处理是有运算符,而且还不止一个:

#(单井号)    —— 字符串化运算符。

##(双井号 )—— 连接运算符

#@               —— 字符化运算符。

接下来我们会分别说明一下他们的用法.

1.字符串化运算符 —— #

用于创建字符串,#运算符后面应该跟一个形参(中间可以有空格或Tab),例如:

#define STR(s) #s

puts(STR(Here is a Demo)); // 相当于puts("Here is a Demo");

常用实例:

我们的调试代码的时候有时需要打印一些字符串的值,如下:

#include

#define Dump_Str(s) printf("%s = %s\n",#s,s);

int main()

{

const char * pchName = "Gui xue";

Dump_Str(pchName);

}

2.连接运算符 —— ##

用于将两个Token连接成一个Token; 这里提到一个需要概念Token

,先说明一下:

什么是Token?

人与人之间的沟通,通过说话,而每句话便是由单词组合在一起,形成特定的语义。这里的单词便可理解成 Token。

C语言编译器相当于一个翻译,要懂两种语言——C语言和机器语言;它的工作是将C语言翻译成机器语言。首先它应该读懂C语言中的“句子”,而对整个“句子”的理解,是建立在对每个“单词”理解的基础上的,所以首先我们要把句子分成多个单词——分词。

词法分析便是将C语言的“句子”按照词法规则拆分成 Token 序列。

例如:

#define __CONCAT(x,y)x ## y

int n1 =15;

int n2 =200;

__CONCAT(n,1); // n1

__CONCAT(n,2); // n2

常见用法:glib库中

stdint.h (sysdeps\generic):150:   #define __INT64_C(c)    c ## Lstdint.h (sysdeps\generic):151:   #define __UINT64_C(c)    c ## UL

将某个常量后自动加上 L或UL,达到数据类型强制转换的目的。

3.字符化运算符—— #@

用于创建一个字符,类似 ## ,注: 非 ANSI-C中的特性,GCC不支持,VC可以; 使用实例如下:

#include

#define Dump_Str(s) printf("%s = %s\n",#s,s);

#define Dump_Char(c) #@c

int main()

{

printf("%c\n",Dump_Char(g));//g

printf("%c\n",Dump_Char(guix));//x 可以输入 4个长度的字符,但只输出最后一位

printf("%c\n",Dump_Char( guix ));//x 默认去除前后空格,保留中间空格

printf("%c\n",Dump_Char(guixu));//error C2015: too many characters in constant

}

C语言 预处理二(宏定义--#define)

//#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 ...

面试问题4:C语言预处理包括哪些

问题描述:C语言 预处理包括哪些操作 C语言的三种预处理包括:宏定义(#define).文件包含(#include).条件编译(#if.#else.#endif). 对于宏定义的介绍: 宏定义必须写在 ...

不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出

[源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...

C语言位运算符:与、或、异或、取反,左移和右移

C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

C语言预处理指令的初步了解

所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分 ...

C语言位运算符:与、或、异或、取反、左移和右移

语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

go语言的运算符

什么是运算符:运算符用于在程序运行时执行数学或逻辑运算 go语言的运算符如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 一,算数运算符 运算符 描述 实例 + 相加 A ...

C语言的运算符的优先级与结合性+ASCII表

[0]README 0.1) 内容来源于 C程序设计语言, 旨在整理出C语言的运算符的优先级与结合性, 如下图所示(哥子 记了大半年都没有记住,也是醉了,每次都要去翻): Alert)以下内容转自:h ...

3014C语言_运算符

第四章 运算符 4.1 分类 C语言的运算符范围很广,可分为以下几类: 1.算术运算符:用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(%).自增(++).自减(--)共七种. 2 ...

随机推荐

Flips测试类(page43)

测试用例:所用java类: StdOut,StdIn , Counter, StdRandom, public class Flips { public static void main(String ...

HUST 1017 Exact cover (Dancing links)

1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 6110 次提交 3226 次通过 题目描述 There is an N*M matrix with only 0 ...

【转】Visual Studio快捷键汇总

原文网址:http://www.cnblogs.com/lanxuezaipiao/p/3451943.html Visual Studio最好用的快捷键(你最喜欢哪个) 每次在网上搜关于VS有哪些常 ...

css学习知识点

各个前缀所代表的浏览器: Webkit: chrome, safari[也有可能是opera] Moz: 火狐 Ms: 主要是IE O: opera border-radius:  IE9  -web ...

JavaScript中的classList的使用

动态控制元素的样式 style[样式名] = 值 增删改class的方式 classList下的方法 增加 class — node.classList.add() 删除 class — node.c ...

bwdist matlab

bwdist函数用于计算元素之间的距离. 举个例子: 如果a= 0     0     0     0     0     0     1     1     1     0     0     1  ...

hdu 1358:Period(KMP算法,next[]数组的使用)

Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

前端读者 | 前端开发者调试面板vConsole

来着微信团队开源的一个调试工具,[GitHub地址]https://github.com/Tencent/vConsole 一个轻量.可拓展.针对手机网页的前端开发者调试面板. 特性 查看 conso ...

c语言预处理和连接区别,C语言预处理运算符相关推荐

  1. C语言 const 和 define 区别 - C语言零基础入门教程

    目录 一.const 使用 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面 4.const 修饰在函数名后面 5.const 修饰函数参数 二.define 使用 ...

  2. C语言 typedef 和 define 区别 - C语言零基础入门教程

    目录 一.typedef 简介 1.typedef 简化复杂的类型声明 A.定义普通变量 B.定义函数指针 C.定义结构体 2.定义与平台无关的类型 二.define 简介 三.typedef 和 d ...

  3. C语言 全局变量和局部变量区别 - C语言零基础入门教程

    目录 一.全局变量和局部变量简介 1.全局变量简介 2.局部变量简介 二.全局变量和局部变量注意事项 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语 ...

  4. C语言 NULL 和 0 区别 - C语言零基础入门教程

    目录 一.关于 NULL 定义 二.NULL 和 0 区别 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.关于 NULL 定义 NU ...

  5. C语言 指针和数组区别 - C语言零基础入门教程

    目录 一.前言 二.指针和数组区别 1.通过 sizeof 获取大小 a.计算数组大小 b.计算指针大小 2.指针和数组赋值方式不同 a.指针赋值 b.数组赋值 3.指针是指针变量,数组是指针常量 三 ...

  6. C语言 memcpy和memcpy_s区别 - C语言零基础入门教程

    目录 一.memcpy 和 memcpy_s 函数区别 1.语法对比 memcpy_s 函数语法 memcpy 函数语法 2.memcpy 和 memcpy_s 相同点 3.memcpy 和 memc ...

  7. c语言表达式与变量区别,C语言实战开发————基础秘籍1(C与C++的区别,输入输出,函数,变量,运算符)...

    (一)学前思考 学习目标 1 面试 2 后期服务 :JNI(C语言)C JAVA 编程思想 编程能力 (二)所学内容 C语言与C++的区别 1.C是面向过程 C++面向对象 2.面向过程与面向对象最大 ...

  8. c语言与编程语言的区别,C语言与其他编程语言的区别

    答案:C语言 主要因为它具有强大的功能.许多著名的系统软件, 如PC-DOS,DBASE Ⅳ都是由C语言编写的.用C语言加上一些汇编语言子程序, 就更能显示C语言的优势了.归纳起来C语言具有下列特点: ...

  9. c语言scanf与gets区别,C语言 scanf()和gets()函数的区别

    C语言 scanf()和gets()函数的区别 1.相同点:scanf( )函数和gets( )函数都可用于输入字符串 2.不同点:两者在功能上有所区别,具体区别如下: 要实现如下需求"从控 ...

最新文章

  1. laravel框架中文手册_Laravel框架的这些你都懂的话,它核心架构基本就懂了
  2. mysql开发java心得_关于mysql 一些优化心得
  3. 三层架构的原理及实现
  4. 字符指针(子串个数统计)
  5. 【springboot+easypoi】一行代码搞定excel导入导出
  6. bst java_图解:二叉搜索树算法(BST)
  7. Codeforces Round #260 (Div. 1) A - Boredom DP
  8. Linux三剑客之grep
  9. 2021年1月13日以后,如何用Flash Player打开swf文件
  10. 星际2 BETA客户端背景音乐打包下载(附提取方法)
  11. Involution: Inverting the Inherence of Convolution for Visual Recognition(CVPR2021)
  12. 【导数术】12.极值点偏移与拐点偏移
  13. jmeter里看java的log,jmeter中java协议请求
  14. 微信缓存dat怎么转图片_微信dat文件转换为图片
  15. 在word中10秒一键将900个mathtype公式转换成word自带公式--GrindEQ公式转换神器
  16. 沟通失败是怎样造成的
  17. java生成短信验证码_Java随机生成手机短信验证码的方法
  18. 什么是机器语言,汇编语言,高级语言?C 语言有什么特点(优点)?
  19. python 代码编译
  20. python爬虫之正则表达式(爬取妹子网图片)

热门文章

  1. vol.144 日本异闻录 · 三句日语,就在涩谷推倒了她们(下)
  2. 跟李宁老师学Python视频课程(11):正则表达式-李宁-专题视频课程
  3. openwrt修改密码
  4. 南丁格尔玫瑰图 | 集才华和美貌于一身的数据图表
  5. 【论文阅读】Reinforcement Learning-Based Black-Box Model Inversion Attacks
  6. 阿里巴巴2014秋季校园招聘-软件研发工程师笔试题
  7. 安全系列之CAS系统
  8. java list 时间排序吗_java中的list时间排序
  9. MSER最大稳定极值区域
  10. 微信支付二维码链接,微信内才能打开 怎么才能做到单独跳转