为了账号安全,请及时绑定邮箱和手机立即绑定

从零开始的月份编号

从零开始的月份编号

慕森王 2019-12-03 10:56:17
某些流行的编程语言使用的月份编号相差1 – Java和Java一样,如果要使用内存,C是另一个。我有一些问题:如果您要忽略外行使用的月份编号,那么为什么出于一致性考虑,也要忽略外行使用的日期编号,并从0开始对每个月中的天数进行编号?为什么这么常见?首先是谁的主意?
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

使用零开始计数实际上是Assembly程序员的一种优化技巧。他们没有将1分配给计数寄存器,而是对其进行了异或运算,这在CPU周期中略快。这意味着计数将从0开始,并且始终取决于元素的长度(不包括最后一个元素)。

另外,在指针算术中也使用零,在这种情况下,您将使用一个基本指针指向某些已分配的内存,再加上第二个指针,该指针与该基本指针的偏移量。在这里,使用零值将偏移量指向存储块的基数很有意义。(一般的数组逻辑往往是基地址加上偏移量x记录大小。)

从零开始的月份数字?通常,许多编程环境自某些默认数据起将数据计算为几天。1899年12月31日是一个受欢迎的日期,尽管还有许多其他日期用作基准日期。所有其他日期都偏离此基准,并且将仅存储为一个数字。分数将用于表示小时,分钟和秒,其中0.25表示24/4 = 6小时。因此,要将日期转换为真实日期,所有环境要做的就是将此数字转换为真实日期。

但是,从零开始的数组和从1开始的月份值的组合确实带来了问题。要获取第9个月的月份名称,您必须从month数组中获取第8项。一些开发人员会很乐意在获得名称之前减少月份数。其他人则倾向于将月份更改为从零开始的格式,因为人们只想知道名称,而不是数字。这是个人观点。


查看完整回答
反对 回复 2019-12-03
?
呼如林

TA贡献1798条经验 获得超3个赞

就是这样,基于此假设而构建的巨大软件意味着这将持续一段时间。

我的看法是这是C的错,所有其他后来才出现的语言也都遵循了C。

您会从不了解的人那里得到一些有趣的情况。我们的团队发现的少数Y2K错误之一是一个网站,自豪地宣称年份是19100,因为它们在struct tm年份之前加上了文字“ 19”。


查看完整回答
反对 回复 2019-12-03
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

是的,罗马人也有零问题。


这只是数学(是程序设计的重要组成部分,尤其是早期程序设计)的[非直觉]结果,将零定义为第一个(有问题的术语是一个)实数,正 *自然数,并且由于数组使用实数进行了索引,自然数,“第一个”元素位于索引0。


月实际上是数组中的命名值,其中天和年是编号的值-将天/年看成看起来像{“ 1”,“ 2”,“ 3”,...的数组可能会更有用。 .. } 他们自己。


至于为什么这是如此普遍(除了在数学上是正确的),您列出的所有语言都是出于同一原因而起源的……


编辑:


进一步研究它,这个Wikipedia链接详细说明了零索引的几个好而有趣的原因(它并没有直接说明为什么月被零索引了,但我认为已经涵盖了),因此,该SO链接已经回答了之前的问题。


似乎普遍的观点是“历史事故”或“因为月份不是数字,所以不能与日/年存储进行比较”,具体取决于您问的是谁。


*对不起,对不起,物理!=有事再来咬我。现在去熨烫我的手。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 766 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信