解答:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) MIN(*p++, b)会产生宏副作用

剖析:这个面试题主要考察宏定义可以实现函数的功能。但是它终归不是函数,宏定义中括弧的”参数“也不是真的参数,在宏展开的时候对”参数“进行的是一对一的替换。

C++中另一个进行代码替换的是#inline,它们之间的区别是:

1. define只是简单的宏替换,通常会产生二义性;而inline会真正地编译到代码中 

2.  inline函数是否展开由编译器决定,有时候当函数太大时,编译器可能选择不展开相应的函数

程序员对宏定义的使用要非常小心,特别注意以下两个问题:

(1)谨慎地将宏定义中的“参数”和整个宏虹括号括起来。所以严格地将讲,下述解答#define MIN(A,B) (A) <= (B) ? (A) : (B)  以及 #define MIN(A,B) (A <= B ? A : B) 都是不对的。

(2)防止宏的副作用。宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B)) 对MIN(*p++, b)的作用结果是 ((*p++) <= (b) ? (*p++) : (*p++))这个表示式会产生副作用,指针p会作三次++自增操作  

除此之外,另一个不好的解答是#define MIN(A,B) ((A) <= (B) ? (A) : (B));

这个解答在宏定义的后面加了“;“

【转】写一个标准宏MIN,这个宏输入两个参数并返回较小的那个。另外当写下least=MIN(*p++,b)时会发生什么的更多相关文章

  1. 写一个标准宏MIN,输入两个参数,返回较小的

    #define MIN(A,B) ((A) <= (B) ? (A) : (B))MIN(*p++, b)会产生宏的副作用 剖析: 这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函 ...

  2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

    #define  MIN(A,B)   ((A)<=(B)?(A):(B))

  3. 请写一个php函数,可以接受任意数量的参数

    请写一个php函数,可以接受任意数量的参数 这是一道面试题.怎么写这个函数呢? function fun(......) { } ----------------------------------- ...

  4. 写一个方法,用于解读 url 后面的请求参数,最终得到 {"a":2,"b":3,"c":4};

    function getUrlParams(url){ let searchParam = url.split("?")[1]; let searchItemParams = se ...

  5. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值

    main函数表示法        很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...

  6. 配置一个Oracle共享服务器进程环境需要哪两项参数

    SHARED_SERVERS和DISPATCHERS. PROTOCOL(pro或prot): 调度程序要监听的网络协议.这是唯一必需的属性 ADDRESS(ADD或者ADDR): 指定调度程序正在上 ...

  7. 写一个程序,统计自己C语言共写了多少行代码。ver2.00

    概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...

  8. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  9. 写一个简易web服务器、ASP.NET核心知识(4)

    前言 昨天尝试了,基于对http协议的探究,我们用控制台写了一个简单的浏览器.尽管浏览器很low,但是对于http协议有个更好的理解. 说了上面这一段,诸位猜到我要干嘛了吗?(其实不用猜哈,标题里都有 ...

随机推荐

  1. log4cxx安装和使用

    log4cxx是Java社区著名的log4j的c++移植版,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计,log4cxx是apache软件基金会的开源项目,基于APR实现跨平台支持 ...

  2. Winform 控件

    ※控件在视图工具箱里面找,找到之后双击即可添加进来,也可以点住拖进来 ※每个工具,控件,窗体都有一个name,相当于id,用来标识该对象的名称,name值不允许重复 控件: 1.Label -- 文本 ...

  3. Android Support Font 安卓系统支持字体(配图)

    测试了一台安卓机器,发现所有字体显示都一样.

  4. ASPNET服务端控件练习(一个机试题)

    简单记录: 模糊查询的select语句的拼写 public List<Model.Student> GetWhereStudent(string name, string sub, str ...

  5. ios 开源代码

    .开源代码 http://www.oschina.net/iOS/codingList/365/ios-button http://www.devdiv.com/iOS_iPhone-iOS6%E6% ...

  6. Windows 服务入门指南

    有很多时候,我们需要创建Windows Service. 这篇文章可以算是一个入门指南吧,希望对初学者有帮助. 要创建Windows Service, 首先选择Windows服务项目,如下图: 这里我 ...

  7. BackgroundWorker的使用方法

    http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(VS.80).aspx Backgroun ...

  8. IE已经被抛弃,但是不能遗忘

    虽然IE的兼容问题,在我写这篇文章的时候基本已经被抛弃了,但是我觉得还是应该了解一下最基本的解决办法. 就像中国的历史已经过去,但是我们不能忘记一样的. 逐个版本解决法 .bb{ background ...

  9. json_encode注意

    PHP5.2或以上的版本把json_encode作为内置函数来用,但只支持utf-8编码的字符,否则中文就会出现乱码或者空值.解决办法如下: 1.保证在使用JSON处理的时候字符是以UTF8编码的.具 ...

  10. 关于oracle 11g 64位与 32位的 plsql、及其他32位应用程序共存的问题

    因为 plsql 不支持 64位 oracle 客户端,所以plsql 必须使用 oracle 的 32位 instanclient 包.  解压缩后放一个目录,例如: D:\Oracle\insta ...