关于#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): ...
随机推荐
- Vue axios post 传参数,后台接收不到为 null
由于axios默认发送数据时,数据格式是Request Payload,而并非我们常用的Form Data格式,后端未必能正常获取到,所以在发送之前,需要使用qs模块对其进行处理. cnmp inst ...
- html常用标签详解
html常用标签详解 一.总结 一句话总结: 这些资料没必要自己总结,可以直接网上找,简单方便,再根据需求改一下 二.HTML常用标签详解 转自或参考:HTML常用标签详解https://blog.c ...
- unity热更新AssetBundle框架设计_框架篇
目录 第1 章 : AssetBundle框架整体设计 课时1:实战项目开发AB技术问题分析 10:53 课时2:实战项目开发AB技术解决方案 10:24 课时3:AB框架整体设计方案详解 09:45 ...
- 使用adb 命令(atrace)抓起systrace的方法。【转】
本文转载自:https://www.cnblogs.com/liuliu-word/p/9963017.html adb shell atrace -c -b 10240 --async_start ...
- C# ffmpeg 视频处理
ffmpeg的官网:https://ffmpeg.org/ ffmpeg是一个强大的视频处理软件(控制台程序),可以通过C# 调用ffmpeg,并传入指令参数,即可实现视频的编辑. /// <s ...
- MD5与SHA1
一.MD5 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于 ...
- 回声消除(AEC)原理
一.前言 因为工作的关系,笔者从2004年开始接触回声消除(Echo Cancellation)技术,而后一直在某大型通讯企业从事与回声消除技术相关的工作,对回声消除这个看似神秘.高端和难以理解的技术 ...
- 官方Android Camera2 录像示例--停止录像时崩溃修正
官方Android 使用Camera2示例项目地址:https://github.com/android/camera-samples 视频录像示例:https://github.com/androi ...
- Thread.currentThread与this的区别
在看多线程的时候,看到这个知识点,感觉需要验证一下. 一:线程自启动 1.程序 package com.jun.it.thread; public class MyThread extends Thr ...
- CSS清除浮动方法集合
CSS清除浮动方法集合 一.浮动产生原因 - TOP 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. ...