C语言学习问题

#define DOUBLE(x) 2*x则DOUBLE(1+2)的值是?
要有过程,谢谢

C宏展开
带参数的宏定义:

除了一般的字符串替换,还要做参数代换

格式:   #define 宏名(参数表) 字符串

例如:#define S(a,b) a*b

area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;

类似于函数调用,有一个哑实结合的过程:

(1)实参如果是表达式容易出问题

#define S(r) r*r

area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;

正确的宏定义是#define S(r) ((r)*(r))

(2)宏名和参数的括号间不能有空格

(3)宏替换只作替换,不做计算,不做表达式求解

(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存

(5)宏的哑实结合不存在类型,也没有类型转换。

(6)函数只有一个返回值,利用宏则可以设法得到多个值

(7)宏展开使源程序变长,函数调用不会

(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
复制别人的.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-06-07
DOUBLE(1+2) 原样替换 为 2*1+2 = 4追问

为什么是这样的,为什么不是1+2*2?

追答

#define 在预处理时是原样替换的,不会对顺序做出改变,先把1+2当做整体和x替换

追问

1+2做整体不应该是2*(1+2)?

追答

看做整体不是加括号,你这是被数学思维误导了,你可以使用编译器进行分步编译,编译出预处理文件,打开预处理文件,就可以看到编译器是如何处理预处理命令了

本回答被提问者采纳
第2个回答  2018-06-07
x=1+2=3;
double(1+2)=2*3=6
相似回答