加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 青铜写法:
    • 白银答案:
    • 黄金答案:
    • 铂金答案:
    • 钻石答案:
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

一个宏定义看看你的 C语言级别

2023/09/25
3039
阅读需 5 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是轩哥。

今天我们通过一个 C语言中的宏定义来看一看,不同段位的程序员都是怎么样来写代码的。这个宏定义是我在面试过程中习惯性使用的第一个问题,然而很多面试者的回答都停留在了比较初级的写法上,至少说明经验尚浅,踩的坑太少啊。

我们先来看一下题目:请定义一个宏函数,函数的功能是返回两个参数中较大的值。

青铜写法:

#define MAX (x,y) x > y? x: y

这是遇到的最多的写法,对于这个答案,我想学过谭浩强版 C语言的程序员大概都能闭着眼写出来。测试一下:‍

#define MAX (x,y) x > y? x: y int result = MAX(1!= 1,1!= 2);

按照宏定义规则,在编译器进行展开后,可以考虑一下,表达式是不是就乱掉了?你不知道使用者传进来的是个数还是表达式,所以有必要改进一下。

白银答案:

#define MAX(x,y) (x) > (y)? (x): (y)

这个答案还是中规中矩的,一般有个两三年编码经验的人都应该写出这样的答案,否则我认为你可能连 ctrl + c 和 ctrl + v 还没整熟练。
不过还是有些情况下调用会产生意想不到的效果,因为高优先级的运算符会闯进来哦。
测试一下:

#define MAX(x,y) (x) > (y)? (x) : (y)int result = 3 + MAX(1,2);

上面的调用在编译前展开后为:

int result = 3 + (1) > (2) ? (1) : (2) 

所以,我们有必要去查一查 运算符 “+” 、 “>” 以及 “?:” 哪个优先级更高一些了。

可以看到,加减乘除的运算优先级是遥遥领先的。

黄金答案:

#define MAX(x,y) ((x) > (y) ? (x) : (y))

嗯,为了避免运算符的问题,我们再加一层括号,码程序不是耍技巧,拿不准的情况下,我多加括号就可以了。我们再测试一下:

#define MAX(x,y) ((x) > (y) ? (x) : (y)) int result = 3 + MAX(i++,j++); 

上面的调用案例是不是让你反应过来了,这里面的 i++是被直接展开的,因此在我们的代码里实际上是被调用了两次哦!

int result = 3 + ((i++) > (j++) ? (i++) : (j++));

这样你计算出的结果总是大一点

铂金答案:

#define MAX(x,y) ({          int _x = x;             int _y = y;              _x > _y ? _x : _y;   }) 

好,既然你输入的参数能变换莫测,我就定义一个变量把他先放寄存器里,中间不让你再打扰我,全处理完我再返回给你。
新来个搞算法的程序员,调用测试一下吧

MAX(3.65,3.68); 赋值错误!,你这函数写的兼容性也太差了,到底支持什么样的类型也没说清楚,我以为是万能的呢

钻石答案:

#define MAX(type, x, y) ({        type _x = x;                  type _y = y;                  _x > _y ? _x : _y;        })

老子成全你,我把类型也搞成个参数,你自己定某天公司来了个 Python 程序员一起 review 代码逻辑。这是什么鬼。。。。。。

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
CRCW120610K0FKEAHP 1 Vishay Intertechnologies Fixed Resistor, Metal Glaze/thick Film, 0.75W, 10000ohm, 200V, 1% +/-Tol, 100ppm/Cel, Surface Mount, 1206, CHIP, HALOGEN FREE AND ROHS COMPLIANT

ECAD模型

下载ECAD模型
$0.44 查看
CBC3225T101MRV 1 TAIYO YUDEN General Purpose Inductor,
$0.62 查看
4611H-701-121/560L 1 Bourns Inc RC Network, Terminator, 120ohm, 50V, 0.000056uF, Through Hole Mount, 11 Pins, SIP, ROHS COMPLIANT
暂无数据 查看

相关推荐

电子产业图谱

多年硬件从业经验,专注分享从研发到供应链,再到精益制造过程中的经验和感悟!