关于#define 的宏替换的一些问题
#define PI 3.14; int main()
{
double r = , s = ;
s = r * r * PI;
s = PI * r * r;
// s = 3.14; * r * r;
printf("%f \n",s);
return ;
}
在使用#define时 如 #define PI 3.14 最好不要写成 #define PI 3.14;
这样程序在预编译的时候 进行宏替换 会将PI 直接替换成 3.14;当 s=r*r*PI; 时会替换成 s=r*r*3.14;;程序运行时只是产生了空语句,不进行语法报错,而 s=PI*r*r; 时 会替换成s=3.14;*r*r; 程序报错
#define int int*
void main()
{
int p;
#undef
int a;
return ;
}
上述代码 程序从上往下进行,在预编译时会将int 替换成int * #undef 终止宏的有效替换 所以p是个整型指针 a是个整型变量
#define MAX(x,y) ((x)>(y))?(x):(y) int Max(int a,int b)
{
return a>b? a:b;
} int main()
{
int a = , b = ;
double x=12.23,y = 34.45;
double c = Max(x,y);
c = MAX(x,y);
c = MAX(a,b); printf("%d ",a);
return ;
}
程序在预编译的时候 看到c=MAX(x,y),将替换成 c=((12.23)>(34.45))?(12.23):(34.45); 即c=34.45;
区别于Max(a,b); 是函数调用
#define SUM(x,y) ((x * y))
int main()
{
int a = , b = ;
int c = SUM(a+,b+);
// int c = (a+5*b+6);
printf("%d \n",c);
return ;
}
在预编译的时候替换成
int c = (a+5*b+6); 输出 29
#define begin {
#define end }
int main()
begin
int a = ;
printf("%d ",a);
end
通过宏改变了c 语言的语法风格 用begin 于 end 替换了{ }
#include<stdio.h>
#define MAX(x,y) ((x)>(y))?x:y
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int a = , b = ;
//int c= Max(++a,b);
// printf("%d\n",c);
int x=MAX(++a,b);
printf("%d \n",x);
return ;
}
宏替换 int x=((++a)>(b))?++a:b: 先对a进行自加 变成11 然后比较 又对a进行自加变成12 赋给 x 所以输出x为12
关于#define 的宏替换的一些问题的更多相关文章
- C宏替换优先级
宏替换仅仅是简单的替换,它不会影响运算符优先级的,比如: #define DOUBLE(x) x+x int i = DOUBLE(5)*5; printf("%d", i); 相 ...
- ISO/IEC 9899:2011 条款6.10.3——宏替换
6.10.3 宏替换 约束 1.两个替换列表是相同的,当且仅当两个替换列表中的预处理符记都具有相同的数.次序.拼写,以及空白分隔符,这里所有的空白分隔符都认为是相同的. 2.当前被定义为一个类似对象的 ...
- Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子)
Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子) 由其做动态编程时非常有用,必须符合js中的语法,用eval能够执行. var aaa="alert('这是变量中的语句')&q ...
- Java中的宏变量,宏替换详解。
群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 首先来看下面这段程序,和群友分享的大致一样. public static void main(String[] args) { String ...
- C++ 中 #ifndef, #define, #endif 宏定义
目的:为了保证包含的内容只被程序(include) 和编译了一次.判断预处理器常量是否已被定义. 预编译将所有头文件(#include"XXX.h")用头文件中的内容来替换,头文件 ...
- C/C++宏替换详解
目录 1. 基本形式 2. 宏展开中的陷阱 3. #undef 4. 宏参数.# 和 ## 1. 基本形式 #define name replacement_text 通常情况下,#define 指令 ...
- 结构体中使用#define定义宏
struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* ...
- word中利用宏替换标点标点全角与半角
Alt+F11,然后插入-模块: 复制下面代码到编辑窗口: Sub 半角标点符号转换为全角标点符号() '中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragrap ...
- #define定义宏函数 的正确使用
如何使用宏来定义一个自定义函数呢?首先我们来看下面这段代码 #define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): ...
随机推荐
- sqlite3 查看Cookie文件<转>
原帖地址:https://blog.csdn.net/yygydjkthh/article/details/37604309 .使用命令对此数据库进行打开: $ sqlite3 cookies.sql ...
- JVM 类加载器的双亲委托机制
1.类加载器的层次结构 在双亲委托机制中,各个加载器按照父子关系形成了树形结构(逻辑意义),除了根加载器之外,其余的类加载器都有且只有一个父加载器. public class MyTest13 { p ...
- postgresQL 服务器端守护进程
- k8s 集群部署--学习
kubernetes是google开源的容器集群管理系统,提供应用部署.维护.扩展机制等功能,利用kubernetes能方便管理跨集群运行容器化的应用,简称:k8s(k与s之间有8个字母) Pod:若 ...
- vsnprintf和snprintf(vsnprintf就是为了支持va_list,实现对于sprint功能封装而做的)
vsnprintf和snprintf是C语言printf家族函数的成员,相关函数列表如下: #include <stdio.h> int printf(const char *format ...
- golang配置镜像站点
In Linux or macOS, you can execute the below commands. Bash / # Enable the go modules feature export ...
- Android利用canvas画各种图形
Android利用canvas画各种图形(点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形) 本文链接:https://blog.csdn.net/rhljiayou/article/det ...
- python链接mysql pymysql
python链接mysql import pymysql conn = pymysql.connect(user=', database='gbt2019', charset='utf8') curs ...
- Python利用ctypes实现按引用传参
C的代码 void test_cref(char *a, int *b, char *data) { , sizeof(char)); strcpy(p, "cute"); a[] ...
- 获取Django model中字段名,字段的verbose_name,字段类型
如下app:ywreport下存在model:Game: class Game(models.Model): name = models.CharField(u'游戏名称',max_length=30 ...