【问题标题】:What are "symbolic constants" and "magic constants"?什么是“符号常数”和“神奇常数”?
【发布时间】:2017-05-13 08:35:36
【问题描述】:

在 Bjarne Stroustrup 的 A Tour of C++ 中,每章末尾都列出了一些建议。在第一章的结尾,其中一个写道:

避免“魔术常量”;使用符号常量;

什么是魔法常量和符号常量?

【问题讨论】:

  • the_meaning_of_life vs 42
  • @Richard Great,采纳了。
  • 好吧,编码约定 101。

标签: c++ constants


【解决方案1】:
somethingElse = something * 1440;           // a magic constant
somethingElse = something * TWIPS_PER_INCH; // a symbolic one

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

后者更有用,因为意图很明确。

如果您有多个具有相同值的事物,使用符号常量也有很大帮助:

static const int TWIPS_PER_INCH = 1440;
static const int SECTORS_PER_FLOPPY = 1440; // showing my age here :-)

这样,如果其中一个发生更改,您可以轻松识别代码中的哪个1440 必须更改。魔术1440s 分散在整个代码中,您必须在多个地方更改它找出哪些是缇,哪些是扇区。

【讨论】:

  • 我刚刚偶然发现“...1440; // showing my age here :-)”。 1440 年——不可能,1440 天——太少了。但后来我意识到:社区中的一些人甚至可能从未使用过软盘。哎呀,现在,我也超过了我的年龄......
  • @Scheff - 你们这些孩子和你们新奇的 3.5" 软盘。[老人的声音] 在我的日子里,软盘是 5.25" 英寸,每个磁道有 13 个扇区,35 个磁道,140k,如果你是不小心,当你掉下它时,你可能会用椅子把磁盘翻过来毁掉它。 [老人声音]
  • @ScottThompson 嗯,但是 3,5" floopies 更酷。除了增加容量之外,它们还有这个开关来改变它们是否是只读的......(甚至,一些我的(旧)USB 记忆棒采用了这个好主意。)
【解决方案2】:

magic constant 将是一个数值,您只需将其键入一些代码,而无需解释它为何存在。想出一个好的例子是具有挑战性的。但是让我们试试这个:

float areaOfCircle(float radius) {
    return radius * radius * 3.14159
}

在这里,我使用了 3.14159 的“魔常数”,但没有解释它的来源。说起来会更好的风格

const float pi = 3.14159
float areaOfCircle(float radius) {
    return radius * radius * pi;
}

在这里,我向阅读代码的人提供了一些关于常量来自何处以及为什么使用它的想法......它似乎并没有“神奇地”突然出现。

【讨论】:

  • 个人认为 pi 不是一个很好的例子,因为 pi 实际上是一个值而不是一个名称。
  • 我不反对。我很难想出一个更好的例子,而不是同样平庸。
  • 更糟糕的是(我已经看到了)355 / 113 - 在您真正弄清楚它是什么之前,您可能会想很长时间:-)
【解决方案3】:

魔法:

int DeepThought() { return 42; }

象征性:

const int TheAnswerToTheUltimateQuestionOfLifeTheUniverseAndEverything = 42;
int DeepThought() { return TheAnswerToTheUltimateQuestionOfLifeTheUniverseAndEverything; }

【讨论】:

  • 这就是生命、宇宙和万物的终极问题的简单答案。
  • 您可能最好调用 函数 theMeaningOf... 而不是更晦涩难懂的 Q,它几乎与幻数有相同的问题(不清楚它应该是什么):-)
  • @paxdiablo Q 是故意模糊不清的,因为事实证明,问题到底是什么总是有问题的 ;-)。除了文学背景,你当然是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多