一些流行的编程语言使用月份编号,这个编号是1 - JavaScript会想到,Java也是如此,如果内存服务,则C是另一种。我有一些问题:
答案 0 :(得分:51)
使用零来开始计数实际上是程序员编程人员的优化技巧。它们不是将1分配给计数寄存器,而是将寄存器与其自身进行异或,这在CPU周期中稍微快一些。这意味着计数将从0开始,并且总是达到元素的长度,不包括最后一个。
此外,使用零也很受指针算术的欢迎,你可以使用一个指向某个已分配内存的基指针,再加上第二个指针,该指针位于该基指针的偏移处。在这里,使用零值很有意义将偏移量指向内存块的基数。 (通用数组逻辑往往是基址加偏移x记录大小。)
基于零的月份数字?通常,许多编程环境将数据计算为自某些默认数据以来的天数。 1899年12月31日是一个受欢迎的日期,尽管还有很多其他日期作为基准日期。所有其他日期都偏离此基数,并将仅存储为一个单一数字。分数将用于表示小时,分钟和秒,其中0.25将是24/4 = 6小时。因此,要将日期转换为实际日期,所有环境所要做的就是将此数字转换为实际日期。
但是,基于零的数组和基于1的月值的组合确实会带来问题。要获取月份9的月份名称,您必须从月份数组中获取项目8。一些开发人员会很高兴在获得它的名字之前减少月份数。其他人则倾向于将月份更改为零基础,因为人们只想知道名称而不是数字。这是个人观点。
答案 1 :(得分:5)
它就是这样,并且为这个假设而构建的软件的巨大重量意味着它将会存在一段时间。
你会从那些不太了解的人那里得到一些有趣的情况。我们团队发现的为数不多的Y2K错误之一就是一个自豪地宣称年份为19100的网站,因为它们将struct tm
年的前缀与文字“19”作为前缀。
答案 2 :(得分:4)
是的,罗马人也有零问题。
这是只是数学的一个[非直观的]结果(是编程的一个强大组成部分,特别是早期编程),将零定义为第一个(有问题的一个)真实,正 *自然数,并且由于数组使用实数,自然数进行索引,因此“第一个”元素位于索引0处。
月份实际上是数组中的命名值,其中日期和年份是编号值 - 将天数/年数视为数组看起来像{“1”,“2”,“3”可能更有用“,......}他们自己。
至于为什么这么常见(除了在数学上是正确的)之外,你列出的所有语言都源于一个共同的起源......
编辑:
进一步研究一下,这个wikipedia链接详细说明了零索引的几个好的和有趣的原因(这并没有直接说明为什么月份是零索引但我认为已经涵盖了),而且这个{{3之前已经回答了这个问题。
看起来流行的观点要么是“历史事故”,要么“因为月份不是数字所以无法与日/年存储进行比较”,具体取决于您的要求。
*对不起,抱歉,物理!=数学回来咬我。我现在要熨手了。