這個人吶,面?zhèn)€試都會緊張,一緊張就忘東西。。。哎
其實(shí)究其原因在于自己對知識了解沒有深入到一定程度(自己:怪我咯)。
起因
今天被問到使用C++語言中的宏來求一年的秒數(shù)。
分析問題,其實(shí)秒數(shù)很容易計算嘛-> 天數(shù) x 小時數(shù) x 秒數(shù)。
1小時 = 3600秒
1天 = 24小時
1年 = 閏年 ? 366 : 365 天
所以這個宏要怎么寫呢?
當(dāng)時想法
算了,想個簡便辦法,反正題目中也沒什么規(guī)定,那我就寫個
#define SECOND_OF_YEAR 365*24*3600
好了
仔細(xì)想想,你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);//不能賦值呀
輸出結(jié)果:
31622400
31536000
31536000
這樣算是一個答案,輸入年份,在控制臺打印出當(dāng)年的秒數(shù)。
如果要把答案再完善一些怎么辦呢?在宏定義中去調(diào)庫函數(shù)獲取當(dāng)前年份好了。
擴(kuò)展一下
從上面的代碼又想到一個問題,就是上面測試代碼中被注釋的一句,就是如果我需要這個宏作為一個方法來使用,要求通過宏獲得一個返回值。
一開始我的想法:
。。宏哪有什么返回值咯?如果你強(qiáng)行要返回值,那就在宏中對
__YEAR__的值作一個修改,或者傳入一個另外的參數(shù),將計算結(jié)果賦值給這個參數(shù)咯。這樣在調(diào)用過宏之后,也能得到計算結(jié)果。
所以使用這個宏時,可能變成這樣:
int year = 2003;
SECOND_OF_YEAR(year);
std::cout << year << std::endl;
結(jié)果是這樣:
31536000
哈哈,這樣其實(shí)也挺好的?。ê媚忝冒?,你個弱雞)
如題的答案
如果真的要返回值,其實(shí)是可以做到的啊!
童鞋,你可還記得這樣的代碼:
int a = 1;
int b = 2;
int c = 3;
a = b = c; //寫成這樣想必會更好理解 a = (b = c);
std::cout << a << "," << b << "," << c << std::endl;
輸出結(jié)果:
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;
結(jié)果:
31536000
因?yàn)樯厦姘苏Z句,所以表達(dá)式中要用{}來包含語句,不能直接在()中寫完整的語句。那如果我不想寫這么大一堆怎么辦?
其實(shí)下面一行代碼就能解決這個問題:
#define SECOND_OF_YEAR(__YEAR__) (__YEAR__ % 100 != 0 && __YEAR__ % 4 == 0) ? 366 * 24 * 3600 : 365 * 24 * 3600
功能同上。
了解這一塊之后,其實(shí)宏定義能做的事,真的炒雞多啊~