计算机编程中的"神奇数字"是什么?

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个源文件并更改729730当容量增量变化.你可以改变一行:

#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)

这为您的代码增加了绝对零的额外信息,完全浪费时间.

  • +1是如何不这样做的好例子(thedailywtf昨天收集了大量的那些:http://thedailywtf.com/Articles/Avoiding-Magic-Constants.aspx) (3认同)
  • @paxdiablo你为常数做了另一个好例子.你错误输入了E数学常数.它不是:2.718128而是:2.71828 ...使用常量可以保存您在代码中的(难以找到)拼写错误. (2认同)

mpe*_*pen 6

"幻数"是出现在语句中的数字

if days == 365
Run Code Online (Sandbox Code Playgroud)

假设你不知道一年中有365天,你会发现这个说法毫无意义.因此,将所有"魔法"数字(在程序中具有某种重要性的数字)分配给常量是一种很好的做法,

DAYS_IN_A_YEAR = 365
Run Code Online (Sandbox Code Playgroud)

从那以后,与之相比.它更容易阅读,如果地球被淘汰不对齐,我们获得额外的一天......你可以很容易地改变它(其他数字可能更有可能改变).

  • @Nick:穿上裤子真是太棒了,让我告诉你.除了每一百年,我们都很幸运.(除了每四百个,我们没有.)并且不要让我开始闰秒. (3认同)
  • "如果地球变得不对齐,我们又会获得额外的一天" - 奇怪的是,这似乎每四年发生一次.:) (2认同)
  • 我发现的最有趣的一段代码:`#define PI 3.14159 /* make Define in case PI Ever Changes */` :-) (2认同)

Ste*_*314 5

这不仅仅是一个含义.大多数答案已经给出的(一个任意未命名的数字)是一个非常常见的,我唯一要说的就是有些人走向定义的极端......

#define ZERO 0
#define ONE 1
Run Code Online (Sandbox Code Playgroud)

如果你这样做,我会追捕你并且毫不留情.

但是,另一种幻数用于文件格式.它只是一个值,通常是文件中的第一件事,它有助于识别文件格式,文件格式的版本和/或特定文件的字节序.

例如,您可能有一个幻数0x12345678.如果你看到这个神奇的数字,那么你可以看到一个正确格式的文件.另一方面,如果你看到0x78563412,那么你可以看到你正在看到相同文件格式的字节序交换版本.

然而,术语"幻数"被滥用了一些,指的是几乎任何标识文件格式的东西 - 包括标题中相当长的ASCII字符串.

http://en.wikipedia.org/wiki/File_format#Magic_number