c语言宏函数返回值,C++宏定义方法的返回值

本文通过一个面试问题引入,讨论如何使用C++宏定义来计算一年的秒数,包括处理闰年的场景。文中详细展示了如何编写宏以返回计算结果,并探讨了不同实现方式及其简化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个人呐,面个试都会紧张,一紧张就忘东西。。。哎

其实究其原因在于自己对知识了解没有深入到一定程度(自己:怪我咯)。

起因

今天被问到使用C++语言中的宏来求一年的秒数。

分析问题,其实秒数很容易计算嘛-> 天数 x 小时数 x 秒数。

1小时 = 3600秒

1天 = 24小时

1年 = 闰年 ? 366 : 365 天

所以这个宏要怎么写呢?

当时想法

算了,想个简便办法,反正题目中也没什么规定,那我就写个

#define SECOND_OF_YEAR 365*24*3600

好了

仔细想想,你tm是不是个程序员啊?如果需求不清楚,那就去确定需求啊!如果需求清楚了,那你就把逻辑写完整啊!(痛骂自己一顿,切忌侥幸心理)

马后炮

那么完整的答案该怎么写呢?

#include

#define SECOND_OF_YEAR(__YEAR__) \

do { \

if (__YEAR__ % 100 != 0 && __YEAR__ % 4 == 0) { \

std::cout << 366 * 24 * 3600 << std::endl; \

} else { \

std::cout << 365 * 24 * 3600 << std::endl; \

} \

} while (false)

测试代码:

SECOND_OF_YEAR(2004); //闰年

SECOND_OF_YEAR(2003); //非闰年

SECOND_OF_YEAR(2000); //非闰年

// int a = SECOND_OF_YEAR(2003);//不能赋值呀

输出结果:

31622400

31536000

31536000

这样算是一个答案,输入年份,在控制台打印出当年的秒数。

如果要把答案再完善一些怎么办呢?在宏定义中去调库函数获取当前年份好了。

扩展一下

从上面的代码又想到一个问题,就是上面测试代码中被注释的一句,就是如果我需要这个宏作为一个方法来使用,要求通过宏获得一个返回值。

一开始我的想法:

。。宏哪有什么返回值咯?如果你强行要返回值,那就在宏中对__YEAR__的值作一个修改,或者传入一个另外的参数,将计算结果赋值给这个参数咯。这样在调用过宏之后,也能得到计算结果。

所以使用这个宏时,可能变成这样:

int year = 2003;

SECOND_OF_YEAR(year);

std::cout << year << std::endl;

结果是这样:

31536000

哈哈,这样其实也挺好的!(好你妹啊,你个弱鸡)

如题的答案

如果真的要返回值,其实是可以做到的啊!

童鞋,你可还记得这样的代码:

int a = 1;

int b = 2;

int c = 3;

a = b = c; //写成这样想必会更好理解 a = (b = c);

std::cout << a << "," << b << "," << c << std::endl;

输出结果:

3,3,3

上面的写法看得懂,那就好说了啊,直接上代码咯:

#define SECOND_OF_YEAR(__YEAR__) \

({ \

int bLeap = false; \

if (__YEAR__ % 100 != 0 && __YEAR__ % 4 == 0) bLeap = true; \

else bLeap = false;\

bLeap ? 366 * 24 * 3600 : 365 * 24 * 3600; \

})

测试代码:

int a = SECOND_OF_YEAR(2003);

std::cout << a << std::endl;

结果:

31536000

因为上面包含了语句,所以表达式中要用{}来包含语句,不能直接在()中写完整的语句。那如果我不想写这么大一堆怎么办?

其实下面一行代码就能解决这个问题:

#define SECOND_OF_YEAR(__YEAR__) (__YEAR__ % 100 != 0 && __YEAR__ % 4 == 0) ? 366 * 24 * 3600 : 365 * 24 * 3600

功能同上。

了解这一块之后,其实宏定义能做的事,真的炒鸡多啊~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值