因为我不应该在我的代码中有魔术数字,所以我应该#define ZERO 0

时间:2014-03-28 21:54:51

标签: c++

我希望优化代码的可读性。当他们看到0时,我不希望人们阅读我的代码时感到困惑。 0的含义可能非常含糊不清。例如,如果我有一个像if (myVector.size() > 0)这样的陈述,那可能会让人感到困惑,因为毕竟在这种情况下零是什么意思?我想知道我是否应该把

#define ZERO 0

在我的代码顶部。

5 个答案:

答案 0 :(得分:5)

你错过了这里的观点。魔术不是关于使用数字 - 它是关于能够理解为什么使用这个特定数字。将size()与0进行比较时,您的意图非常明显。您是否将其与任何其他数字进行了比较 - 例如42 - 您必须解释为什么选择此特定数字。

至于此特定更改(0 => ZERO),它只会在您的代码中引入重言式。

答案 1 :(得分:0)

用于计数器,索引,累加器,算术表达式的比较或初始化的

0是完全可以理解的。

在精确值无关且可以在不造成任何伤害的情况下进行更改并且具有特定于上下文的解释(如FREE_CLUSTER或NO_ERROR)的情况下创建标识符是有意义的。

答案 2 :(得分:0)

  

我想知道我是否应该加上   #define ZERO 0
  在我的代码顶部。

只要您要求0 幻数否,请勿执行此操作! 你应该只使用

if (myVector.size()) // ...

可以等效地再现语句的行为。

语言 保证 0评估为 false 任何其他值的计算结果为 true ,用于评估条件表达式。

答案 3 :(得分:0)

不,不要这样做。这是一个糟糕的选择,完全没必要。在这种特定情况下,您的代码非常明显:

if (myVector.size() > 0)

没有人会对此感到困惑。但如果是这样的话:

if (myVector.size() > 23*66)

然后 会让人感到困惑,因为有人在阅读你的代码时会想知道地狱23*66意味着什么。这是一个神奇的数字。在这样的上下文中,#define可以提供帮助,并附有评论,例如:

/* We have at most 23 files with 66 records each */
#define MAX_RECORDS_NO 23*66

然后你有:

if (myVector.size() > MAX_RECORDS_NO)

这种情况你可以并且肯定想要避免魔术数字。请注意,#define描述这个数字意味着什么,如果我遵循你的逻辑,我会选择这个:

#define TWENTY_THREE_TIMES_SIXTY_SIX 23*66

现在,这不是很有帮助,是吗? #define ZERO 0完全忽略了这一点:它不会给读取代码的人增加任何内容,而是过于冗长,并且它无用,因为0的值很可能不会发生变化。如果突然想要将myVector.size()与另一个数字进行比较,该怎么办?您必须替换常量名称,因为将ZERO定义为0以外的其他内容会导致问题。所以,毕竟,你一无所获。

答案 4 :(得分:0)

你不需要这样做。

正如您所看到的,原始代码已经很简单了。

另外,想一想。如果将零定义为0,是否要将零更改为0以外的其他值?当然,答案是肯定的。