基于零的月份编号
一些stream行的编程语言使用的月份编号是1 – JavaScript和Java一样,想到Java,如果内存服务,C是另一个。 我有一些疑问:
- 如果你会忽略外行人使用的月份编号,那么为什么不为了一致性而忽略外行人使用的date编号,以及从0开始的每个月的date?
- 为什么这很常见?
- 这首先是谁的想法?
使用零开始计数实际上是汇编程序员的一个优化技巧。 不是给计数寄存器赋1,而是把自己的寄存器与寄存器进行XOR运算,CPU周期稍微快一些。 这意味着计数将从0开始,并且总是达到元素的长度,不包括最后一个元素。
另外,零的使用在指针算术中也很受欢迎,在这种情况下,你将使用一个指针指向一些分配的内存,再加上一个位于该指针偏移处的第二个指针。 在这里,使用零值使得将偏移量指向内存块的基础很有意义。 (通用数组逻辑往往是基地址加偏移xlogging大小。)
和基于零的月份数字? 通常,许多编程环境会将数据计算为自某些默认数据以来的数天。 1899年12月31日是一个受欢迎的日子,虽然已经有很多其他date作为基准date。 所有其他date偏离这个基地,并将被存储为一个单一的数字。 分数将用于表示小时,分钟和秒,其中0.25将是24/4 = 6小时。 因此,要将date转换为实际date,所有环境所要做的就是将此date转换为实际date。
但是,基于零的数组和基于1的月份值的组合确实会带来问题。 要获得月份9的月份名称,您必须从月份数组中获得项目8。 一些开发商会很乐意减less月份的数量,然后得到它的名字。 其他人则倾向于将月份变成零基础,因为人们只想知道名字,而不是数字。 这是个人观点。
这就是事实,这个假设所构build的软件的巨大重量意味着它将在一段时间内出现。
我的意见是这是C的错,所有其他Johnie刚刚来的新语言都与之相符。
你会从不知情的人那里得到一些有趣的情况。 我们团队发现的less数Y2K漏洞之一是一个网站,自豪地宣布年份为19100,仅仅是因为它们将struct tm
年份与字面“19”相连。
是的,罗马人也有零问题。
这只是math的一个[非直观的]结果(是编程的一个强大组成部分,特别是早期编程),将零定义为第一个(有问题的术语,即一个)实数, 正数 *自然数,并且由于数组以真实,自然数的“第一个”元素是在索引0。
几个月是数组中的真正的命名值,date和年份是数字值 – 将数/天视为数组看起来像{“1”,“2”,“3”,或许更有用。 .. } 他们自己。
至于为什么这是如此常见(除了math上是正确的),所有你列出的语言从一个共同的起源下降一件事…
编辑:
进一步来看,这个维基百科链接详细介绍了零索引的几个好的和有趣的理由(这并不直接说明为什么月份是零索引,但我认为已经涵盖),这个链接已经回答了以前的问题。
看起来普遍的观点是“历史事故”,或者“因为月份不是数字,所以不能与日/年储存相比较”,这取决于你问的是谁。
*抱歉,对不起,物理!=math回来咬我。 现在就关掉我的手。