什么是"象征常数"和"魔术常数"?

som*_*ude 9 c++ constants

在Bjarne Stroustrup的C++之旅中,每章末尾列出了一些建议.在第一章的最后,其中一个读到:

避免''魔术常数;''使用符号常数;

什么是魔法和象征常数?

pax*_*blo 16

somethingElse = something * 1440;           // a magic constant
somethingElse = something * TWIPS_PER_INCH; // a symbolic one
Run Code Online (Sandbox Code Playgroud)

第一个是魔术常量的一个例子,除了它的值之外,它不传达任何其他信息.

由于意图明确,后者更有用.

如果你有多个具有相同值的东西,使用符号常量也会有很大帮助:

static const int TWIPS_PER_INCH = 1440;
static const int SECTORS_PER_FLOPPY = 1440; // showing my age here :-)
Run Code Online (Sandbox Code Playgroud)

这样,如果其中一个发生了变化,您就可以轻松识别1440代码中的哪个单元必须更改.由于魔法1440分散在整个代码中,你必须在多个地方改变它,找出哪些是缇,哪些是扇区.


Sco*_*son 7

A magic constant将是一个数字值,您只需键入一些代码,而不解释它为何存在.提出一个好榜样很有挑战性.但是我们试试这个:

float areaOfCircle(float radius) {
    return radius * radius * 3.14159
}
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了3.14159的"魔力常数",没有任何解释它来自何处.这会是更好的风格

const float pi = 3.14159
float areaOfCircle(float radius) {
    return radius * radius * pi;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我给了阅读代码的人一些关于常数来自何处以及为什么使用它的想法...它似乎并没有"神奇地"出现在任何地方.