猿问

从零开始的月份编号

某些流行的编程语言使用的月份编号相差1 – Java和Java一样,如果要使用内存,C是另一个。我有一些问题:

  • 如果您要忽略外行使用的月份编号,那么为什么出于一致性考虑,也要忽略外行使用的日期编号,并从0开始对每个月中的天数进行编号?

  • 为什么这么常见?

  • 首先是谁的主意?


慕森王
浏览 810回答 3
3回答

慕尼黑8549860

使用零开始计数实际上是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链接已经回答了之前的问题。似乎普遍的观点是“历史事故”或“因为月份不是数字,所以不能与日/年存储进行比较”,具体取决于您问的是谁。*对不起,对不起,物理!=有事再来咬我。现在去熨烫我的手。
随时随地看视频慕课网APP
我要回答