14

我真的很好奇这个,有谁知道他们为什么打破这个惯例?

谢谢, 夏兰

4

10 回答 10

27

@Cory:你会惊讶地知道谁潜伏在 StackOverflow 上。:-)

你说得很对。CFML 的最初设计是允许非程序员构建复杂的 Web 应用程序。ColdFusion\CFML 是第一种专门为构建 Web 应用程序而设计的语言。早在 1995 年,Web 主要是静态 HTML,而典型的“Web 开发人员”并没有做太多的编程。该语言本身被设计为尽可能简单,这就是为什么它仍然是最快/最容易学习的语言之一。

它可能会导致一些混乱,尤其是当 ColdFusion 代码直接与 Java 或 .NET 交互时。然而,它只是成为那些“怪癖”之一。2000/2001 年,当 CF 被重新构建为 Java EE 应用程序时,该决定被重新考虑,但向后兼容性阻止了这种变化。

于 2009-01-07T15:52:49.407 回答
12

有两种约定,一种适用于大多数编程语言,一种适用于大多数非程序员。他们可能是针对那些不从 0 开始计数的人。

于 2009-01-07T14:47:21.677 回答
10

如果我不得不猜测,那是因为 ColdFusion 旨在吸引新手,基于 1 的数组可能更有意义 - 第一项是数字 1,第二项是数字 2,依此类推。

奇怪的是我们计算机科学家!

于 2009-01-07T14:47:54.360 回答
6

好吧,除非我们有任何原始设计师,否则除了推测之外,做任何事情都很难。但是在前世使用过CF,我有一些想法。

如果您查看原始语言,它是为希望构建动态应用程序而没有太多复杂性的人设计的 RAD 类型开发。我仍然记得他们最终发布用户定义函数时的喜悦,因此我不必到处使用标签。

基于此,人们必须处理的语言的各个方面(例如数组)将变得更加“友好”,这是有道理的。对我来说,看到 array[0] 非常有意义。但对于尚未了解这一范式的新人来说,这没有任何意义。为什么要访问位置“0”的对象?

有趣的是,既然 CF 是后端的 Java,您实际上必须处理索引从 1 开始的情况,以及索引从 0 开始的情况。因此,通过尝试提供帮助,它们实际上增加了更多的复杂性语言已经成长。

于 2009-01-07T14:49:05.027 回答
6

作为一个不同的旋转,让我们问为什么在某些语言中数组索引从零开始?对于计算离散对象(如数组元素),这没有什么意义,而且从人类的角度来看也不自然。

这最初似乎源于诸如 C 之类的语言(尽管我并不是说它首先出现在 C 中:我不知道,并且对此无关紧要),其中语言及其编程相当接近耦合到内存管理(malloc等)。一些 C 语言的自负与引擎盖下内存中的内容非常接近。变量就是一个例子:除了变量名,我们总是忙于变量所在(或开始于)的内存地址以及指针等。

所以我们来到 C 中的数组,它们的索引方式是,有一系列元素驻留在内存中,从数组变量的基本内存位置开始,每个元素都偏移数据类型的大小(例如:一个字符是一个字节,等等)。所以要在内存中找到数组中的每个元素,我们这样做:

arrayBaseAddress + (whichElementItIsInTheArray * sizeOfDataType)

在用 C 语言做事时,确实会发现自己确实是这样思考的,因为它与计算机在后台必须执行的操作非常接近,以找到代码想要的值。

因此whichElementItIsInTheArray用于偏移内存地址(以 为单位 sizeOfDataType)。

显然,如果一个数组索引从 1 开始,它将在内存中偏移一个,出于所有意图和目的,在第一个元素实际驻留的位置之间sizeOfDataType浪费sizeOfDataType大量内存。arrayBaseAddress

有人可能会认为这无关紧要,但在过去所有这些都被实施的日子里,内存就像黄金一样:不能就这样浪费掉。所以有人可能会想“好吧,好吧,只是whichElementItIsInTheArray在引擎盖下偏移 -1,然后就可以完成了。然而,就像内存一样,时钟周期是黄金,所以与其浪费处理,这个想法是程序员只需要习惯一种不自然的计数方式。

因此,在这些情况下,有正当理由从索引 0 开始数组。

在我看来(现在这已进入编辑倾向)当随后的“花括号”语言出现(如 Java)时,无论它是否真的相关,它们只是效仿,因为“这就是它的完成方式”。而不是“这种方式有意义”。

另一方面,更现代的语言,以及更远离计算机内部运作的语言,有人停下来思考“我们为什么要这样做?”,以及“在这种语言及其预期用途的背景下,这是否使感觉?”。我同意这里的答案是——坚定地——“不”。在很多情况下,将数组索引偏移 -1 或只是忽略第零个元素的内存的资源浪费不再是相关的考虑因素。那么,纯粹出于遗留原因,为什么要让语言和程序员不得不将他们自然计算事物的方式抵消一分呢?没有正当理由这样做。

在 C 中,有一个数组元素a[0]。这是数组的第一个元素(不是“第零”元素),如果这是数组的全部范围,它的长度是one。所以这里的特殊行为是编程语言的一部分,而不是“在现实生活中”(我们大多数人居住的地方)计算/枚举事物的方式。那为什么还要坚持呢?

这里的一些人用“当我们出生时,我们不是一个,我们是零”来反驳这个“从哪里开始索引”的论点。这是真的,但那是测量一个连续的东西,并且不一样。所以与谈话无关。数组是离散项的集合,在测量离散项的数量(即:计数)时,我们从一个开始。

这如何增加对话?好吧,这并不多,但这是看待同一件事的不同方式。我想这是对这个概念的一种合理化/反应,有些人认为从 1 开始的数组索引在某种程度上是“错误的”。这没有错,从人类的角度来看,这比从零开始更正确。因此,让人类像人类一样编写代码,并让机器根据需要来理解它。基本上,我们从一开始就从零开始计算它们只是因为遗留技术限制,如果我们不再需要,就没有必要延续这种做法。

当然,所有“IMO”。

于 2012-06-27T07:55:26.617 回答
5

数一数你一只手的手指数。你是从 0 开始计数还是从 1 开始计数?

与现实生活密切相关的抽象概念总是更容易理解和应用(例如:考虑物理“堆栈”,然后考虑抽象数据结构)。

于 2009-01-07T14:52:56.363 回答
3

从 0 开始数组的概念在 C 语言中得到普及。FORTRAN 和 COBOL 等较早的语言从 1 开始计算数组(在 COBOL 中实际上称为表)。

于 2009-01-14T14:00:56.410 回答
2

数组的起点没有约定。例如,大多数基础知识也从 1 开始。有些语言允许您在任何您喜欢的地方开始数组,或者允许数组索引是枚举等(例如 Ada)。C 在 0 处使用了 sting 的概念,许多语言都遵循了这一概念,但并非所有语言都如此。他们不这样做的一个原因是从 1 开始的数组更加直观。

于 2009-01-07T14:46:24.520 回答
0

即使在 Java API 的编程世界中,也有一个有趣的例外,即从 0 开始的计数:JDBC API。它从 1 开始计数,这让每个第一次访问数据库的程序员都感到惊讶。

于 2009-01-07T15:50:20.910 回答
0

也许这不仅仅是门外汉的事情......我认为大多数接近任何网络语言的人至少都在摆弄javascript(10,15年前也是如此)。基于 0 的索引并不那么陌生。

我喜欢以 1 开始索引/位置(对于字符串)的语言的一点是,您可以执行以下操作

<cfif find("c","cat")>

评估true是否找到 c,它会。

而像 javascript 这样的基于 0 的语言

if ("cat".indexOf("c")) { 

评估为false,所以你需要说类似if ("cat".indexOf("c") >= 0) {

然而,语言之间的翻译是一个小麻烦,不能忘记,因为忘记这样做,或者忘记填充你的数组会导致数据翻译失败,而在两种风格之间切换会导致挫败感。

我认为,如果 Allaire 知道网络最终会在哪里以及客户端和服务器如何真正协同工作,我们就会拥有从 0 开始的索引。

于 2015-01-26T20:08:23.983 回答