#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 的宏替换的一些问题的更多相关文章

  1. C宏替换优先级

    宏替换仅仅是简单的替换,它不会影响运算符优先级的,比如: #define DOUBLE(x) x+x int i = DOUBLE(5)*5; printf("%d", i); 相 ...

  2. ISO/IEC 9899:2011 条款6.10.3——宏替换

    6.10.3 宏替换 约束 1.两个替换列表是相同的,当且仅当两个替换列表中的预处理符记都具有相同的数.次序.拼写,以及空白分隔符,这里所有的空白分隔符都认为是相同的. 2.当前被定义为一个类似对象的 ...

  3. Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子)

    Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子) 由其做动态编程时非常有用,必须符合js中的语法,用eval能够执行. var aaa="alert('这是变量中的语句')&q ...

  4. Java中的宏变量,宏替换详解。

    群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 首先来看下面这段程序,和群友分享的大致一样. public static void main(String[] args) { String ...

  5. C++ 中 #ifndef, #define, #endif 宏定义

    目的:为了保证包含的内容只被程序(include) 和编译了一次.判断预处理器常量是否已被定义. 预编译将所有头文件(#include"XXX.h")用头文件中的内容来替换,头文件 ...

  6. C/C++宏替换详解

    目录 1. 基本形式 2. 宏展开中的陷阱 3. #undef 4. 宏参数.# 和 ## 1. 基本形式 #define name replacement_text 通常情况下,#define 指令 ...

  7. 结构体中使用#define定义宏

    struct  hostent {   char    *h_name;        /* official name of host */   char    **h_aliases;    /* ...

  8. word中利用宏替换标点标点全角与半角

    Alt+F11,然后插入-模块: 复制下面代码到编辑窗口: Sub 半角标点符号转换为全角标点符号() '中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragrap ...

  9. #define定义宏函数 的正确使用

    如何使用宏来定义一个自定义函数呢?首先我们来看下面这段代码 #define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): ...

随机推荐

  1. 000 centos7下安装elasticsearch7的单节点安装

    在这里,直接使用最新的包进行学习.这里的安装也以前的版本不同,不过因为学习,这部分安装的区别不具体研究了. 这里也是摸索型的记录,所以会出现报错情况,然后针对这种方式进行解决,最后达到安装完成的效果. ...

  2. win10下caffe+anaconda+python+Jupyter Notebooks安装流程

    python3.5(推荐)或者python2.7 CUDA 8+ cuDNN5.1 python环境不能单独配置,必须先编译caffe,才能编译python环境. 下载caffe prebuild版本 ...

  3. PHP中Cookie与 Session

    在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用  Cookie与 Session 来跟踪和判断. Sess ...

  4. iptables 4张表 5条链

  5. flutter 保持页面状态

    import 'package:flutter/material.dart'; import 'KeepAliveDemo.dart'; void main() => runApp(MyApp( ...

  6. Spring cloud微服务安全实战-5-11实现基于token的SSO(1)

    基于服务器session的SSO的方案,用户的登陆状态都是存在服务器端的 基于浏览器cookie的token实现一个sso,在原来的基础上做进一步的改造.让他不依赖session.而是完全由cooki ...

  7. ES6深入浅出-13 Proxy 与 Reflect-2.Proxy 代理

    阮一峰http://es6.ruanyifeng.com/#docs/proxy MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript ...

  8. 【426】C 传递数组给函数

    参考:C 传递数组给函数 参考:C语言二维数组作为函数参数传递 参考:二维数组作为函数参数传递剖析(C语言)(6.19更新第5种) 总结: 一维数组参数,可以是地址.arr[].arr[n] 二维数组 ...

  9. python设计模式第2版

    python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...

  10. iOS点击按钮第二次不能旋转View

    原因: 用CGAffineTransformMakeRotation,每次旋转都要在之前最后的角度基础之上再转才有效果. - (void)clickAction: (UIButton *)button ...