数组中的幻数? - C++

Ale*_*lex 7 c++ magic-numbers

我是一个相当新的程序员,如果这些信息很容易获得,我很抱歉,我还没有找到它.

这是我的问题:

当您使用文字数来访问数组的特定元素时,是否被视为幻数?

例如:

arrayOfNumbers[6] // Is six a magic number in this case?
Run Code Online (Sandbox Code Playgroud)

我问这个问题,因为我的一位教授坚持认为程序中的所有字面数字都是魔数.我只是使用实数访问数组的元素,而不是为每个元素使用命名常量,这将是很好的.

谢谢!

Kor*_*icz 22

这实际上取决于背景.如果您有这样的代码:

arr[0] = "Long";
arr[1] = "sentence";
arr[2] = "as";
arr[3] = "array.";
Run Code Online (Sandbox Code Playgroud)

...然后0..3不被视为魔术数字.但是,如果你有:

int doStuff() 
{
   return my_global_array[6];
}
Run Code Online (Sandbox Code Playgroud)

...然后6绝对是一个神奇的数字.


i_a*_*orf 6

这真是太神奇了.

我的意思是,你为什么要访问第6个元素?什么是应该应用于该数字的语义?我们所知道的就是"第6个(从零开始)数字".如果我们知道声明arrayOfNumbers我们会进一步了解它的类型(例如a int或a double).

但如果你说:

arrayOfNumbers[kDistanceToSaturn]; 
Run Code Online (Sandbox Code Playgroud)

...现在,对于阅读代码的人来说,它有更多的意义.

通常,迭代遍历数组,对每个元素执行一些操作,因为不知道数组有多长,并且您不能以硬编码方式访问它.

然而,有时阵列元素具有特定含义,例如,在图形编程中.有时数组总是大小相同,因为数据需要它(例如某些变换矩阵).在这些情况下,通过数字访问特定元素可能会也可能不会:领域专家会知道你在做什么,但是通才可能不会.为魔术索引编号指定名称会使那些必须维护代码的人更加明显,并帮助您防止意外键入错误的代码.

在我上面的例子中,我假设你的阵列保持从太阳到行星的距离.太阳将是第0个元素,因此arrayOfNumbers [kDistanceToSun] = 0.然后当你递增时,每个元素包含到下一个最远行星的距离:水银,金星等.这比只输入数字更可读.你想要的星球.在这种情况下,阵列具有固定的大小,因为有固定数量的行星(嗯,除了整个冥王星的崩溃).

另一个问题是"arrayOfNumbers"没有告诉我们数组的内容.我们已经知道了它的一系列数字,因为我们在你所说的某个地方看到了声明,int arrayOfNumers[12345];或者你声明了它.相反,像:

int distanceToPlanetsFromSol[kNumberOfPlanets];
Run Code Online (Sandbox Code Playgroud)

...让我们更好地了解数据实际是什么以及它的语义是什么.作为程序员,您的目标之一应该是编写以这种方式自我记录的代码.

然后我们可以在别处争论是否kNumberOfPlanets应该是8或9. :)


pgb*_*pgb 5

您应该问问自己为什么要访问该特定职位.在这种情况下,我假设如果你做arrayOfNumbers[6]第六个位置有一些特殊的意义.如果你认为这意味着什么,你可能会意识到这是隐藏的神奇数字.