前段時間,無意間在網上看到這么一張圖:
剛看到這段代碼時,我是比較吃驚的,作者竟然使用了一個英文單詞deadbeef來定義宏常量!
我本來以為只是一位幽默的程序員的小玩笑,但后來查閱資料才知道,上圖的這段代碼竟是 C++ 的 hash_map 源碼!而作者使用這個特殊的英文單詞也是 “別有用心”。
deadbeef 的英文直譯是“死牛肉”,但在編程領域中,它卻有著更深層的含義。給這個單詞加上0x、再轉換為大寫,就得到了一個典型的十六進制數字:0xDEADBEEF。
這個數字經常用來標識新分配但是還未初始化的內存;在嵌入式系統中,也常常用它來表示程序崩潰或者出現了死鎖,比如運行在 32 位 PowerPC 處理器上的 IBM RS/6000 系統、Mac OS 系統。
那我不禁感到好奇,為什么選擇了這樣一個單詞,而不是 “FishPi” 之類的(開個玩笑,16 進制最多到 F)。
到網上查了一會,得到的結論竟然是:沒什么理由,它是一個“魔數”!
所謂魔數,就是毫無理由、憑空出現、也不需要去解釋其含義的常量。就是這么任性!
除了 deadbeef 外,我還百度到了很多魔數,比如:
0xBAADF00D ("bad food" 爛飯) 被微軟的 LocalAlloc(LMEM_FIXED)使用,在使用調試堆時指示未初始化的已分配堆內存;
0xDEADC0DE ("dead code" 死碼) 在 OpenWRT 固件中用作標記,在靜態固件的末尾表示要創建的 jffs2 文件系統的開始;
0xDEAD10CC ("dead lock" 死鎖) 用于表示 iOS 系統的閃退報告。
是不是感覺很神奇?也許這就是程序員的浪漫吧!
看到這里,我忍不住也去寫了幾個魔數,大家來猜猜看是什么意思:
redisLock.lease(86400); if(fileSize>1073741824){ ...doSomething } if(num>2147483647){ printf("youlose"); }
這幾個值都是我們寫代碼時經常用的,84600 = 3600 * 24 表示一天;1073741824 = 1024 * 1024 * 1024 表示 1 GB;而 2147483647 是 Java 等編程語言中 int 類型的最大值。
我把這些代碼拿給我朋友一看,他嘲笑道:人家大佬寫的魔數叫魔數,而你寫的,只能叫爛代碼。
的確,除非是上面那些大佬 / 前輩公認的、約定俗成的魔數外,我們在平時寫代碼的時候,盡量不要使用魔數,它會嚴重影響代碼的可讀性。
我們可以通過定義常量來給這些魔數加上 “注釋”,比如:
intONE_DAY=86400; intONE_GB=1073741824; intMAX_INTEGER=2147483647;
這樣就清晰很多了,也減少了我們輸入錯誤的風險。
除了上面提到的魔數外,我還在網上看到了一些有實際意義的魔數,比如現代 3D 游戲之父約翰·卡馬克在雷神之錘中的魔數:
i=0x5f3759df-(i>>1);
完全不敢相信,上面這行代碼竟然可以快速計算一個數字的平方根的倒數!
在網上一查,還有很多論文專門研究這個東西:
不得不感嘆編程的魅力、數學的魅力啊!什么時候,我也能創造一個人盡皆知的魔數呢?
同事:“喂,別特么做夢了,快來搬磚!”
“來了來了,我再給你寫幾個魔數(爛代碼)!”
審核編輯:劉清
-
處理器
+關注
關注
68文章
19440瀏覽量
231327 -
嵌入式系統
+關注
關注
41文章
3630瀏覽量
129794 -
MAP
+關注
關注
0文章
49瀏覽量
15187 -
C++語言
+關注
關注
0文章
147瀏覽量
7040
原文標題:這代碼誰寫的?簡直太可怕了!
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
MSP430之裸奔框架C++程序源碼(菜農C++裸奔大法系列之一) 轉載
大家誰有串口調試助手的源碼,最好是C++的能發我一份嗎,謝謝了
C++中命名空間的幾大用法
VISUAL C++教程之VISUAL C++的安裝和使用方法
![VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安裝和使用方法](https://file.elecfans.com/web1/M00/7F/3A/o4YBAFwkkXWAI3XbAAMQcR8pLac666.png)
C++程序設計教程之C++的初步知識的詳細資料說明
![<b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>C++</b>的初步知識的詳細資料說明](https://file.elecfans.com/web1/M00/89/2B/o4YBAFyJ-q-AYUB7AAVUPZRjpCQ608.png)
C++程序設計的基礎知識初步了解C++的資料免費下載
![<b class='flag-5'>C++</b>程序設計的基礎知識初步了解<b class='flag-5'>C++</b>的資料免費下載](https://file.elecfans.com/web1/M00/95/47/o4YBAFz-DYOAIEloAACt1tceweA466.png)
如何使用C語言實現動態擴容的string
C++學習筆記之c++的基本認識
C++之父新作帶你勾勒現代C++地圖
![<b class='flag-5'>C++</b>之父新作帶你勾勒現代<b class='flag-5'>C++</b>地圖](https://file1.elecfans.com/web2/M00/AD/10/wKgZomU_azGAffwHAAAHSRvJtKU665.png)
C++簡史:C++是如何開始的
![<b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的](https://file1.elecfans.com/web2/M00/A9/66/wKgZomUl7m-AHJX6AABuJjgxs14678.png)
評論