C++宏定义方法的返回值


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

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

起因


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

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

1小时 = 3600秒
1天 = 24小时
1年 = 闰年 ? 366 : 365 天

所以这个宏要怎么写呢?

当时想法

算了,想个简便办法,反正题目中也没什么规定,那我就写个
#define SECOND_OF_YEAR 365*24*3600
好了

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

马后炮


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

#include <iostream>
#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

功能同上。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容