【无标题】c语言--#define替换规则

简介: 【无标题】c语言--#define替换规则

本文对#define 定义的有宏参数替换进行描述,望觉得对你们有帮助的程序猿们小小点赞一下。

一.#define定义宏

#define 机制允许把参数替换到文本中,这种实现通常称为宏(marco)或定义宏(define marco)

下面是宏的声明方式:

#define name(parament-list)stuff

注意:参数列表左括号必需与name相连

#define SQUARE(x) x*x

这个宏接收一个参数

SQUARE(5)

运行程序时,预处理器就会用下面这个表达式替换上面的

#define SQUARE(5) 5*5

结果为25。

但这个宏还存在问题

观察下面的代码

int a=5;
printf("%d", SQUARE(a+1))

答案并不是我们认为的36

事实上,它输出的结果是11

为什么?

替换文本时,x被替换为 a+1

然后 语句实际为:

printf("%d", a+1*a+1)

结果自然为11

改进方法也很简单,在宏定义是加上两个括号

#define SQUARE(x) (x)*(x)

再次运行

printf("%d", (a+1)*(a+1))

结果为36

你以为代码就完善了吗

还有一个宏定义

#define ADD(x) (x)+(x)

int a=5;
printf("%d",10* ADD(a))

你认为结果是多少

100 or 其它

太年轻了

请看代码

运行替换完后:

int a=5;
printf("%d",10*(5)+(5 ))

结果为 55

怎么改进呢,

也是加上一个括号

#define ADD(x) ((x)+(x))

再次运行变为

printf("%d",10*((5)+(5) ))

结果自然为100。

二.宏参数的副作用

这里的副作用指的是改变了其它的值

int a=1;
int b;
b=a+1;

上述代码在给吧b赋值的时没有改变a的值

无副作用

int a=1;
int b;
b=a++;

给b赋值的同时改变了a的值

就产生了副作用

当宏参数在宏的定义中出现超过一此的时候,如果参数带有副作用,那么你在使用宏时会带来不可预测的效果。

代码如下

#define MAX(a,b)(a)>(b)?(a):(b)
...
x=3;
y=4;
z=MAX(x++,y++)
printf("%d %d %d",x,y,z);

根据上述内容可以尝试算一算

解析如下:

z=(x++)>(y++)?(x++):(y++)
//明显x++<y++,所以结果再进行一次y++
//x=4,y=6,z=5


相关文章
|
6月前
|
存储 程序员 C语言
C语言变量命名规则
C语言变量命名规则
332 0
|
15天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
1月前
|
编译器 C语言
C语言:typedef 和 define 有什么区别
在C语言中,`typedef`和`#define`都是用来创建标识符以简化复杂数据类型或常量的使用,但它们之间存在本质的区别。`typedef`用于定义新的数据类型别名,它保留了数据类型的特性但不分配内存。而`#define`是预处理器指令,用于定义宏替换,既可用于定义常量,也可用于简单的文本替换,但在编译前进行,过度使用可能导致代码可读性下降。正确选择使用`typedef`或`#define`可以提高代码质量和可维护性。
|
6月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
5月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
41 1
|
4月前
|
存储 编解码 程序员
C语言17---计算机的存储规则
C语言17---计算机的存储规则
|
5月前
|
C语言
【C语言基础篇】数组传参规则详解
【C语言基础篇】数组传参规则详解
|
6月前
|
存储 编译器 C语言
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
85 0
|
6月前
|
自然语言处理 编译器 Linux
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(下)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
54 0
|
6月前
|
程序员 编译器 C语言
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(中)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
40 0