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