我真的很好奇这个,有谁知道为什么他们在这个上打破了约定?
谢谢,Ciaran
@Cory:你会惊讶地知道谁潜伏在StackOverflow上.:-)
你非常对.CFML的原始设计是允许非程序员构建复杂的Web应用程序.ColdFusion\CFML是第一种专门用于构建Web应用程序的语言.早在1995年,网络主要是静态HTML,而典型的"网络开发者"并没有做太多的编程.语言本身的设计尽可能简单,这就是为什么它仍然是最快/最容易学习的语言之一.
它可能会导致一些混乱,特别是当ColdFusion代码直接与Java或.NET交互时.然而,它只是成为那些"怪癖"之一.该决定在2000/2001年重新审视,当时CF被重建为Java EE应用程序,但向后兼容性阻止了这一变化.
有两种约定,一种是大多数编程语言共有的约定,也是大多数非程序设计者常用的约定.他们可能的目标是那些没有开始计数的人.
如果我不得不猜测,那是因为ColdFusion旨在吸引新手,而基于1的数组可能更有意义 - 第一项是数字1,第二项是数字2等.
这是我们计算机科学家的奇怪之处!
好吧,除非我们有任何原始设计师,否则做任何事情都很难做,只能推测.但是在以前的生活中使用过CF,我有一些想法.
如果您查看原始语言,它是专为RAD类型开发而设计的,适用于那些想要构建动态应用程序且没有太多复杂性的人.我还记得当他们最终发布用户定义函数时的喜悦,所以我不必在任何地方都使用标签.
基于此,那么人们必须处理的语言方面(例如数组)就会变得更加"友好".对我来说,看到数组[0]非常有意义.但是对那些没有学过这种模式的新手来说,这没有任何意义.为什么我要访问位置"0"的对象?
有趣的是,现在CF在后端是Java,你实际上必须处理索引从1开始的情况,以及从0开始的情况.所以通过尝试提供帮助,它们实际上增加了更复杂的语言越来越多.
一方面计算你手指的数量.你开始用0或1开始计数了吗?
与现实生活紧密相关的抽象概念总是更容易理解和应用(例如:考虑物理"堆栈",然后考虑抽象数据结构).
作为一个不同的旋转,让我们问为什么在某些语言中数组索引从零开始?对于计算离散对象(如数组元素),这没有多大意义,从人的角度来看也不自然.
这最初似乎源于像C这样的语言(虽然我并不是说它首先出现在C语言中:我不知道,并且对于这个目的并不重要)语言及其编程相当紧密耦合到内存管理(malloc
等).一些C语言的构思非常接近于内存中的内容.变量就是这样的一个例子:除了变量名之外,我们总是使用指针等来处理变量所在的内存地址(或者从中开始).
所以我们来到C中的数组,并且这些数据的索引方式是存在一系列驻留在内存中的元素,从数组变量的基本内存位置开始,每个元素都被数据类型的大小偏移(例如:char是一个字节,等等).因此,为了在内存中找到数组中的每个元素,我们这样做:
arrayBaseAddress + (whichElementItIsInTheArray * sizeOfDataType)
实际上,当用C语言做事时,一个人确实发现自己这样想,因为它更贴近计算机必须做的事情,以找到代码所需的价值.
因此whichElementItIsInTheArray
用于偏移内存地址(以单位为单位 sizeOfDataType
).
显然,如果将数组索引从1开始,它将在内存中偏移1 sizeOfDataType
,因为所有意图和目的都会在第一个元素实际驻留sizeOfDataType
的位置arrayBaseAddress
和位置之间浪费大量内存.
人们可能会认为这几乎不重要,但是在所有这些实施的日子里,记忆就像金子一样:它不会像那样浪费.所以有人可能会认为"好吧,只是whichElementItIsInTheArray
在引擎盖下偏移-1,并完成它.但是就像内存一样,时钟周期是黄金,所以不是浪费处理,而是程序员只需要习惯一种不自然的计数方式.
于是就有了正当的理由在这些情况下,指数零开始的数组.
在我看来(现在正在进入编辑倾斜)当随后的"花括号"语言出现时(如Java)他们只是跟着它是否仍然是真的相关,因为"这就是它的完成方式".而不是"那种方式有道理".
另一方面,更多的现代语言,以及从计算机内部工作中进一步消除的语言,有人停下来思考"我们为什么这样做?",并且"在这种语言及其预期用途的背景下,这使得感?".我同意这里的答案是 - 坚定地 - "不".将数组索引偏移-1的资源浪费,或者只是忽略第0个元素的内存在很多情况下不再是相关的考虑因素.那么,为什么语言和程序员必须以一种纯粹的遗留原因来抵消他们自然地用一种方式计算事物的方式呢?没有正当理由这样做.
在C中,有一个数组元素a[0]
.这是数组的第一个元素(不是"第0个"元素),如果这是数组的完整范围,则它的长度为1.因此,这里的特殊行为是编程语言的一部分,而不是"在现实生活中"计算/枚举事物的方式(这是我们大多数人居住的地方).那为什么坚持呢?
这里的一些人反驳了这个"从哪里开始索引"的论点,"当我们出生时,我们不是一个,我们就是零".这是事实,但这是衡量一个连续的事情,并不一样.所以与谈话无关.数组是离散项的集合,当测量离散项的数量时(即:计算它们),我们从一开始.
这如何增加对话?嗯,它并不多,但它是一种看待同样事物的不同方式.而且我认为这对于这个概念有点合理化/反应,有些人认为1的起始数组索引在某种程度上是"错误的".没错,从人的角度来看,这比在零开始时更为正确.因此,让人类像人类一样编写代码,让机器根据需要来理解它.基本上只有遗留的技术限制,我们才开始从零开始计算它们,如果我们不再需要,就没有必要延续这种做法.
当然,所有"IMO".