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

作者: qufl | 来源:发表于2016-11-22 01:26 被阅读130次

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

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

起因


今天被问到使用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

功能同上。

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

相关文章

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

    这个人呐,面个试都会紧张,一紧张就忘东西。。。哎 其实究其原因在于自己对知识了解没有深入到一定程度(自己:怪我咯)...

  • OC 链式编程 简单介绍

    1、设置属性和输出属性 定义相关宏 定义几个简单的方法,其中包括有返回值和没有返回值 以上就是简单的使用介绍 i...

  • C++类结构定义_

    C++类结构定义,与Java的差别是:成员方法的实现要在返回值类型之后、方法名称之前加上** ClassName:...

  • 05-基本语法作业第5部分

    121.如何定义方法的返回值 121.如何定义方法的返回值 121.如何定义方法的返回值 122.动手把定义登录功...

  • C++方法无返回值导致Crash

    C++方法定义了需要返回值,但是实现时由于疏忽没有返回值,编译时会出现警告,运行时被调用有很大概率Crash。

  • AppleScript-方法

    定义方法 on 方法名(参数列表)return 返回值 -- 如果无返回值可不写end 方法名 方法的调用可在定义...

  • Java基础知识4—方法与数组

    一.方法 1.方法的定义与调用 1)定义 : 修饰符 返回值类型 方法名(参数列表){ //方法体 } ①返回值类...

  • c++基础(宏)

    有关 c++ 中宏的定义以及使用是今天的重点内容。 C++ 的宏定义将一个标识符定义为一个字符串,源程序中的该标识...

  • 准备:回顾c

    宏定义 关键字 define 定义一个常量的方法(即宏定义) 带参数的宏定义 宏函数的定义 使用宏函数的好处是,不...

  • IOS NSLog宏定义

    IOS NSLog宏定义 标签(空格分隔): IOS IOS NSLog宏定义 宏定义NSLog方法,不用加";"...

网友评论

    本文标题:C++宏定义方法的返回值

    本文链接:https://www.haomeiwen.com/subject/kmkppttx.html