关于#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): ...
随机推荐
- 【JVM】虚拟机字节码执行引擎
概念模型上,典型的帧栈结构如下(栈是线程私有的,也就是每个线程都会有自己的栈). 典型的帧栈结构 局部变量表 存放方法参数和方法内部定义的局部变量.在编译阶段, ...
- 反编译pyinstaller打包的exe安装包
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译 在这里分享一些技巧和经验给大家.辛苦撰文分享,转载或引用请保留本文作者信息及文章链接. 作者的环境: win ...
- vue 遇到防盗链 img显示不出来
在index.html中添加: <meta name="referrer" content="no-referrer">
- [java.lang.NoSuchMethodError: org.hibernate.Session.createQuery(Ljava/lang/String;)Lorg/hibernate/query/Query;]
jar包冲突 maven导入的jar包和自己将lib目录的jar同时加入了项目里面了
- Page directive: invalid value for import
原有项目启动正常,正常访问:后来换成tomcat7.0.70:后启动正常,登陆正常,然而点进去任何菜单都会报错: java.lang.IllegalArgumentException: Page di ...
- python-learning-第二季-数据库编程
https://www.bjsxt.com/down/8468.html 代码实现: #coding:utf- #导入模块 import sqlite3 #创建connect连接 con = sqli ...
- RestSharp - Ignore SSL errors
项目启动时,添加下面代码: 项目启动时,添加 public App() { ServicePointManager.ServerCertificateValidationCallback += (se ...
- CentOS7下搭建Ceph分布式存储架构
(1).Ceph概述 Ceph是为了优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统,并且还是一个开源的分布式文件系统.因为其支持块存储.对象存储,所以很自然的被用做云计算框架opensta ...
- 宣化上人:大佛顶首楞严经四种清净明诲浅释(10-11) -------------------------------------------------------------------------------- (转自学佛网:http://www.xuefo.net/nr/article23/230920.html)
大佛顶首楞严经四种清净明诲浅释(10) 唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 是故阿难.若不断偷修禅定者.譬如有人.水灌漏卮.欲求其满.纵经尘劫.终无平复. 是故阿 ...
- Linux strace追踪命令详解
strace介绍 strace命令是一个集诊断.调试.统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的.当然s ...