关于#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): ...
随机推荐
- Shell同步数据到oracle数据库
某数据库有几张表更新,本地数据库增量更新数据,用脚本定时执行实现. 由于无blob/clob字段,使用sqlldr导入数据:查询目的数据库,以"|"分割导出所有数据,保存在./da ...
- 在JAVA中怎么比较Double类型数据的大小
在JAVA中怎么比较Double类型数据的大小 我来答 浏览 33044 次 3个回答 #活动# “双11”答题活动,奖励加码!最高得2000元购物礼金! pollutedair 2015- ...
- Java IO系统--RandomAccessFile
RandomAccessFile 实现了DataOutput接口和DataInput接口.父类是Object,不继承任何的InputStream和OutStram. public class Rand ...
- web文件上传,带进度条
原生ajax上传带进度条 (百分比) <%@ page language="java" contentType="text/html; charset=UTF-8& ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解
笔记 3.SpringBoot2.x整合redis实战讲解 简介:使用springboot-starter整合reids实战 1.官网:https://docs.spring.io/spring-bo ...
- openresty开发系列1--网关API架构及选型
微服务架构在项目中的应用越来越多,我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些 ...
- JAVA 或与非运算符 与(&)、或(|)、异或(^)
运算步骤: 第一步:.转成二进制,即01表示的数字,如5的二进制为 0000 0101,我用八位表示. 第二步:比较二者位数上的数字 1.与运算符 与运算符用符号“&”表示,其使用规律如下: ...
- o2s【我】
//预处理对象转String方法 private String o2s(Object o) { if(o!=null&&!"".equals(o)&& ...
- Spring cloud微服务安全实战-5-7实现基于session的SSO(客户端应用的Session有效期)
授权模式改造成了Authorization code完成了改造的同时也实现了SSO.微服务环境下的前后端分离的单点登陆. 把admin的服务重启.刷新页面 并没有让我去登陆,直接就进入了首页. ord ...
- Spring cloud微服务安全实战-3-14章节小结
认证:一个httpBasic 一个是用户名密码的认证 授权:数据库内判断的r就是读 w就是写 ,ACL 获取用户信息的这段逻辑,实际上着也是安全机制的一种.防止越权,当前只能看到自己的信息. Spri ...