前段時(shí)間,無(wú)意間在網(wǎng)上看到這么一張圖:

剛看到這段代碼時(shí),我是比較吃驚的,作者竟然使用了一個(gè)英文單詞deadbeef來(lái)定義宏常量!
我本來(lái)以為只是一位幽默的程序員的小玩笑,但后來(lái)查閱資料才知道,上圖的這段代碼竟是 C++ 的 hash_map 源碼!而作者使用這個(gè)特殊的英文單詞也是 “別有用心”。
deadbeef 的英文直譯是“死牛肉”,但在編程領(lǐng)域中,它卻有著更深層的含義。給這個(gè)單詞加上0x、再轉(zhuǎn)換為大寫(xiě),就得到了一個(gè)典型的十六進(jìn)制數(shù)字:0xDEADBEEF。
這個(gè)數(shù)字經(jīng)常用來(lái)標(biāo)識(shí)新分配但是還未初始化的內(nèi)存;在嵌入式系統(tǒng)中,也常常用它來(lái)表示程序崩潰或者出現(xiàn)了死鎖,比如運(yùn)行在 32 位 PowerPC 處理器上的 IBM RS/6000 系統(tǒng)、Mac OS 系統(tǒng)。
那我不禁感到好奇,為什么選擇了這樣一個(gè)單詞,而不是 “FishPi” 之類(lèi)的(開(kāi)個(gè)玩笑,16 進(jìn)制最多到 F)。
到網(wǎng)上查了一會(huì),得到的結(jié)論竟然是:沒(méi)什么理由,它是一個(gè)“魔數(shù)”!
所謂魔數(shù),就是毫無(wú)理由、憑空出現(xiàn)、也不需要去解釋其含義的常量。就是這么任性!
除了 deadbeef 外,我還百度到了很多魔數(shù),比如:
0xBAADF00D ("bad food" 爛飯) 被微軟的 LocalAlloc(LMEM_FIXED)使用,在使用調(diào)試堆時(shí)指示未初始化的已分配堆內(nèi)存;
0xDEADC0DE ("dead code" 死碼) 在 OpenWRT 固件中用作標(biāo)記,在靜態(tài)固件的末尾表示要?jiǎng)?chuàng)建的 jffs2 文件系統(tǒng)的開(kāi)始;
0xDEAD10CC ("dead lock" 死鎖) 用于表示 iOS 系統(tǒng)的閃退報(bào)告。
是不是感覺(jué)很神奇?也許這就是程序員的浪漫吧!
看到這里,我忍不住也去寫(xiě)了幾個(gè)魔數(shù),大家來(lái)猜猜看是什么意思:
redisLock.lease(86400);
if(fileSize>1073741824){
...doSomething
}
if(num>2147483647){
printf("youlose");
}
這幾個(gè)值都是我們寫(xiě)代碼時(shí)經(jīng)常用的,84600 = 3600 * 24 表示一天;1073741824 = 1024 * 1024 * 1024 表示 1 GB;而 2147483647 是 Java 等編程語(yǔ)言中 int 類(lèi)型的最大值。
我把這些代碼拿給我朋友一看,他嘲笑道:人家大佬寫(xiě)的魔數(shù)叫魔數(shù),而你寫(xiě)的,只能叫爛代碼。
的確,除非是上面那些大佬 / 前輩公認(rèn)的、約定俗成的魔數(shù)外,我們?cè)谄綍r(shí)寫(xiě)代碼的時(shí)候,盡量不要使用魔數(shù),它會(huì)嚴(yán)重影響代碼的可讀性。
我們可以通過(guò)定義常量來(lái)給這些魔數(shù)加上 “注釋”,比如:
intONE_DAY=86400; intONE_GB=1073741824; intMAX_INTEGER=2147483647;
這樣就清晰很多了,也減少了我們輸入錯(cuò)誤的風(fēng)險(xiǎn)。
除了上面提到的魔數(shù)外,我還在網(wǎng)上看到了一些有實(shí)際意義的魔數(shù),比如現(xiàn)代 3D 游戲之父約翰·卡馬克在雷神之錘中的魔數(shù):
i=0x5f3759df-(i>>1);
完全不敢相信,上面這行代碼竟然可以快速計(jì)算一個(gè)數(shù)字的平方根的倒數(shù)!
在網(wǎng)上一查,還有很多論文專門(mén)研究這個(gè)東西:

不得不感嘆編程的魅力、數(shù)學(xué)的魅力??!什么時(shí)候,我也能創(chuàng)造一個(gè)人盡皆知的魔數(shù)呢?
同事:“喂,別特么做夢(mèng)了,快來(lái)搬磚!”
“來(lái)了來(lái)了,我再給你寫(xiě)幾個(gè)魔數(shù)(爛代碼)!” 
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
20282瀏覽量
253060 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3757瀏覽量
133717 -
MAP
+關(guān)注
關(guān)注
0文章
49瀏覽量
15856 -
C++語(yǔ)言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7712
原文標(biāo)題:這代碼誰(shuí)寫(xiě)的?簡(jiǎn)直太可怕了!
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
MSP430之裸奔框架C++程序源碼(菜農(nóng)C++裸奔大法系列之一) 轉(zhuǎn)載
大家誰(shuí)有串口調(diào)試助手的源碼,最好是C++的能發(fā)我一份嗎,謝謝了
C++C/C++程序設(shè)計(jì)教程_C/C++概述
C++中命名空間的幾大用法
VISUAL C++教程之VISUAL C++的安裝和使用方法
C++程序設(shè)計(jì)教程之C++的初步知識(shí)的詳細(xì)資料說(shuō)明
C++程序設(shè)計(jì)的基礎(chǔ)知識(shí)初步了解C++的資料免費(fèi)下載
如何使用C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的string
C++學(xué)習(xí)筆記之c++的基本認(rèn)識(shí)
淺談C語(yǔ)言與C++的前世今生
C++之父新作帶你勾勒現(xiàn)代C++地圖
C++簡(jiǎn)史:C++是如何開(kāi)始的
C++的hash_map源碼
評(píng)論