0

所有编程论坛中都有数百个数组主题。甚至可能成千上万。日常。但他们都没有涉及到这方面。

因为数组是从 0 开始索引的,所以我仍然经常从 1 开始访问我的数据。原因是零字段通常可以很好地保存列或行的总数以及状态标志,而不是过多的命名变量。阅读它总是更有意义,因为其中的第四个条目可见为 4,而不是 3。有些人称建筑物的底层为“1”,下一层称为“2”或二楼。其他人称地面上的一楼为1,依此类推。人们因此而迷失在建筑物中。在 CAD 的严苛世界中,任何打断思路的事情,无论是多么轻微的干扰,都等于收入损失。因此,我喜欢尽可能接近自然概念模型的数组。

所以第一个问题是,.. 这是可以接受的做法吗?如果没有,为什么不呢?尽管我是唯一一个阅读我自己的代码的人,但我很少分享它,我认为不要偏离惯例太远是有价值的。至少如果我以自己的血腥方式继续前进,我很清楚原因。

还有一些问题,虽然它们应该有自己的线索,但它们都以某种方式相互关联,所以我也会列出它们

我还发现,数组的某些部分通常是冗余的,因为在您的软件要使用的现实世界中,这些情况不会出现。所以问题二:与其拥有一个大数组,是否可以将数据使用重新考虑成较小的同类数组,其中这些死区被最小化?它与上述问题的关系是,这将是另一组零零场,它们本身可能变得多余。我知道有一种情绪“.. 嘿,有很多记忆”,但不知何故,我的观点只是草率的想法。

和我的最后一个问题:有时我会在我的索引中添加一个偏移量来满足处理用户历史的额外维度**

printf("   %s \t %d \n", foo[i],bar[i][c]);
printf("   %s \t %d \n", foo[i],bar[i][c+1]);
printf("   %s \t %d \n", foo[i],bar[i][c+2]);

所以我在这里担心几件事。在每次访问时进行计算是否会影响速度?在移动应用程序的世界中,这是否代表了一些本来可以避免的电池使用情况?

** 对于阅读本文的任何初学者而言,如果您将 3 维数组视为魔方,则 4 维及以上数组很容易理解。在你坐的房间里放另一个或两个立方体,你有四个。满是房间的建筑物是第五个,依此类推,建筑物的城市街区为六,城市状态为 7,国家等及以上。

4

1 回答 1

0

了解权衡的一个很好的起点是知道您正在谈论的事物的名称。这称为“基于零的编号”,您可以在 Wikipedia 上阅读它:

http://en.wikipedia.org/wiki/Zero-based_numbering

零是违反直觉的想法由来已久,直到今天,“自然数”一词是否应该包括它一直在争论。我觉得这很自然,并且更喜欢将包含其主要入口的建筑物的地板标记为 0(并且地下停车位为 -1、-2、-3...)

(再一次,我支持我们的循环常数应该是 pi 当前值的两倍的想法,比这种趋势在互联网上大放异彩的几年前。)

Dijkstra 提出了一个论点,即从零开始的索引是有意义的。他的理由是,程序员希望能够谈论范围内的数字零,而不必调用 -1 作为界限:

http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

在逆势而上并使用从 1 开始编号的现代语言中,有 Rebol by fiat和 Lua by convention。我认为 Rebol 确实经过深思熟虑,但这是我不同意的决定之一。一般来说,我觉得基于一个的系统所带来的任何优势都被拥有一个标准所抵消......而且处理器架构在这一点上根本不会很快改变。

现在至于这一点:

我经常仍然从一个开始访问我的数据。原因是零字段通常可以很好地保存列或行的总数以及状态标志,而不是过多的命名变量。

这听起来像是一种非常危险的做法。如果您以这种方式滥用您的数组,您就是在自找麻烦,因为您正在颠覆该语言所具有的任何边界检查功能。极端情况下,这种编程方式会让您完全消除单独的变量。结构和类型系统的存在是有原因的。

至于这个:

有时我会在我的索引中添加一个偏移量以适应额外的维度(...),所以我在这里担心一些事情。在每次访问时进行计算是否会影响速度?在移动应用程序的世界中,这是否代表了一些本来可以避免的电池使用情况?

我向您保证,与不使用正确的数组边界所引入的错误相比,这些添加所花费的时间是您最不关心的问题。

于 2012-11-17T22:35:27.380 回答