ckv*_*ckv 23 language-agnostic programming-languages magic-numbers
当人们谈论在计算机编程中使用"魔术数字"时,他们的意思是什么?
pax*_*blo 38
魔术数字是代码中的任何数字,对于知之甚少的人来说并不是很明显.
例如,以下代码:
sz = sz + 729;
Run Code Online (Sandbox Code Playgroud)
有一个神奇的数字,并将更好地写为:
sz = sz + CAPACITY_INCREMENT;
Run Code Online (Sandbox Code Playgroud)
一些极端的观点表明你的代码中除了-1,0和1之外你不应该有任何数字,但我更喜欢一种不那么教条的观点,因为我会立刻认出24,1440,86400,3.1415,2.71828和1.414--这一切都取决于你的知识.
然而,即使我知道一天有1440分钟,我可能仍会使用MINS_PER_DAY标识符,因为它使搜索更容易.谁说上面提到的容量增量也不会是1440而你最终改变了错误的值?对于低数字尤其如此:双重使用37197的机会相对较低,将5用于多个事物的几率非常高.
标识符使用意味着你就不必经过所有700个源文件并更改729到730当容量增量变化.你可以改变一行:
#define CAPACITY_INCREMENT 729
Run Code Online (Sandbox Code Playgroud)
至:
#define CAPACITY_INCREMENT 730
Run Code Online (Sandbox Code Playgroud)
并重新编译该批次.
将此与魔术常数进行对比,这是因为天真的人认为只是因为他们从代码中删除了实际的数字,他们可以改变:
x = x + 4;
Run Code Online (Sandbox Code Playgroud)
至:
#define FOUR 4
x = x + FOUR;
Run Code Online (Sandbox Code Playgroud)
这为您的代码增加了绝对零的额外信息,完全浪费时间.
"幻数"是出现在语句中的数字
if days == 365
Run Code Online (Sandbox Code Playgroud)
假设你不知道一年中有365天,你会发现这个说法毫无意义.因此,将所有"魔法"数字(在程序中具有某种重要性的数字)分配给常量是一种很好的做法,
DAYS_IN_A_YEAR = 365
Run Code Online (Sandbox Code Playgroud)
从那以后,与之相比.它更容易阅读,如果地球被淘汰不对齐,我们获得额外的一天......你可以很容易地改变它(其他数字可能更有可能改变).
这不仅仅是一个含义.大多数答案已经给出的(一个任意未命名的数字)是一个非常常见的,我唯一要说的就是有些人走向定义的极端......
#define ZERO 0
#define ONE 1
Run Code Online (Sandbox Code Playgroud)
如果你这样做,我会追捕你并且毫不留情.
但是,另一种幻数用于文件格式.它只是一个值,通常是文件中的第一件事,它有助于识别文件格式,文件格式的版本和/或特定文件的字节序.
例如,您可能有一个幻数0x12345678.如果你看到这个神奇的数字,那么你可以看到一个正确格式的文件.另一方面,如果你看到0x78563412,那么你可以看到你正在看到相同文件格式的字节序交换版本.
然而,术语"幻数"被滥用了一些,指的是几乎任何标识文件格式的东西 - 包括标题中相当长的ASCII字符串.
http://en.wikipedia.org/wiki/File_format#Magic_number