繁体   English   中英

由于我的代码中不应包含幻数,因此我应该#define零0

[英]Since I'm not supposed to have magic numbers in my code, should I #define ZERO 0

我想优化代码的可读性。 我不希望看到我的代码的人在看到0时感到困惑。 0含义可能非常模棱两可。 例如,如果我有一条类似if (myVector.size() > 0)的语句,那可能会造成混淆,因为毕竟在这种情况下,零意味着什么? 我想知道我是否应该放

#define ZERO 0

在我的代码的顶部。

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

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

这样,在比较,初始化计数器,索引,累加器,算术表达式...中使用0是完全可以理解的。

在确切值无关紧要且可以更改而不会造成任何损害的情况下创建标识符是有意义的,并且具有针对上下文的特定解释,例如FREE_CLUSTER或NO_ERROR。

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

只要您要的是0 幻数不,不要这样做! 你应该简单地使用

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

等效地复制您的语句的行为。

确保使用语言,对于条件表达式的评估, 0评估为false ,其他任何值评估为true

不,不要那样做。 这是一个错误的选择,完全没有必要。 在这种情况下,您的代码非常明显:

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以外的其他值会带来麻烦。 所以,毕竟,您一无所获。

您不需要这样做。

如您所见,原始代码已经很简单了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM