博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写一个标准宏MIN,输入两个参数,返回较小的
阅读量:4583 次
发布时间:2019-06-09

本文共 723 字,大约阅读时间需要 2 分钟。

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

MIN(*p++, b)会产生宏的副作用
剖析:
这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:
(1) 谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )都应判0分;
(2) 防止宏的副作用。
  宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:((*p++) <= (b) ? (*p++) : (b)) 这个表达式会产生副作用,指针p会作两次++自增操作。除此之外,另一个应该判0分的解答是:#define MIN(A,B) ((A) <= (B) ? (A) : (B));
这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。

正确的解法:

  1. #define MIN(a,b) ((a)>=(b)?(b):(a))  

但是:

MIN(*p++,b)会产生副作用。

((*p++)>=(b)?(b):(*p++))这个表达式会使得指针p作2次自增操作。

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/5818391.html

你可能感兴趣的文章
.h与.c的区别和联系
查看>>
JAVA中堆栈和内存分配原理
查看>>
strpbrk函数
查看>>
开通博客园
查看>>
Android Fragment 真正的完全解析(下)
查看>>
js html css
查看>>
本地删除文件,git远程不同步删除
查看>>
【VS开发】从sockaddr中取得客户端或者数据源的Ip地址和端口号
查看>>
【计算机视觉】基于局部二值相似性模式(LBSP)的运动目标检测算法
查看>>
【VS开发】【C/C++开发】memcpy和memmove的区别
查看>>
(浙江金华)Day 1 组合数计数
查看>>
DataMember 特性
查看>>
Android数据存储与访问
查看>>
串并行数据结构实验--MAC下SML环境安装1
查看>>
java取整和java四舍五入方法
查看>>
学习linux-基础-操作系统结构
查看>>
卸载Linux内置的AMP软件
查看>>
关于js的几道经典题(作用域、原型链等)自己做的
查看>>
如何判断js是否加载完全
查看>>
【菜鸟学Python】函数的定义及调用
查看>>