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


這個人吶,面?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í)宏定義能做的事,真的炒雞多啊~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容