为什么数组下标要是0到N-1,而不是1到N?

SHOUYU2 2008-01-29 03:26:48
为什么数组下标是0到N-1而不是1到N?
这样可以避免一些不小心的错误和方便记忆啊。
...全文
1287 81 打赏 收藏 转发到动态 举报
写回复
用AI写文章
81 条回复
切换为时间正序
请发表友善的回复…
发表回复
longzhanyuye2008 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 den88 的回复:]
因为0是自然数啊!
高中时,0时自然数 老师说 自然界中就有0个数 就像古代时接绳记事0 就是没事情
但是我小学时(影响了一批人啊!!!!!!!!!!!!!!!!)
学的时候自然数没有0
到高中老师说为了和世界接轨才该的 到大学学了编程才知道 原来计算机就时这样来的
和世界接轨了
一开始中国的教科书上自然数是不包括0
计算机语言是以数学语言为基础,所以我们理解就有些困难了。


最重要的是…
[/Quote]

50楼的兄台说得非常有道理哈。如果下标从1开始,古代时结绳记事,每天没有什么事都要结万八千个,烦都烦死了
longzhanyuye2008 2008-07-28
  • 打赏
  • 举报
回复
举个例,比如说有个一个空房间(空数组),以0开始,第一个进来的人(元素)说“我是1”,第二个进来的人(元素)说“我是2”,第三个进来的人(元素)说“我是3”,当有人突然问,你们一共有几个人啊(元素个数),只需要最后进来的那个人说出自己是几。但是如果下标从1开始的话,第三个人必须说“一共有我的下标减1”。这个就很不科学了,而且很奇怪
longzhanyuye2008 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wanghao111 的回复:]
加法比减法运算的快
[/Quote]

25楼说得非常好哈,因为所有的运算最终都会转化为二进制,减法永远比加法多一步。所以应该尽量避免减法。(其实减法的根本也是通过加法来计算的)
meltlao2 2008-02-02
  • 打赏
  • 举报
回复
以后你牛比了,你写一个语言就让数组从1到N,也是可以的阿。
星光伴月 2008-02-01
  • 打赏
  • 举报
回复
我突然发现,在CSDN就一个人聪明,其他人全是笨蛋.
"宇宙之父"在造月球时,为什么自转周期是30天而不是1天,如果是1天的话,那么人类对宇宙的认识可能会提前几十万年吧?"宇宙之父"是否也后悔当初没有将月球的自转周期设置为地球的1天?
woshinanren 2008-01-31
  • 打赏
  • 举报
回复
任何一个系统都有定理,公理和前提条件的.否则就不属于这个系统.
你问为什么这样定义公理,和前提.
有什么意义......
SHOUYU2 2008-01-31
  • 打赏
  • 举报
回复
其实这个问题到5楼就该终止了。
对我这样一个初学者就够了,没想到有68个回复。
谢谢大家的参与,这只是一个技术疑问,没有必要进行哲学探讨。
看来大家都很有空啊。
呵呵
as9_2009 2008-01-31
  • 打赏
  • 举报
回复
这完全要问C语言的创始者了.
DennisRitche 2008-01-31
  • 打赏
  • 举报
回复
数组名本身就是首地址
星光伴月 2008-01-31
  • 打赏
  • 举报
回复
C语言当初的设计理念就是"效率(几乎)就是一切",这也是编译器的设计者们的"金科玉律".
在16位机器上,一个16位无符号整型数值的最大值是65535,而不是65536,但是2的16次方的确是65536,最小值是0,而不是1.
所以打个比方,要定义一个含有65536个元素的数组,那么,只要用一个无符号整数型的值做下标就可以了.就是这么简单.
但是如果下标取值是从1到65536的话,那么一个无符号整数值是不够的,解决办法可能会是减少一个元素,改成65535个,但是仅仅因为0不能做下标,就要浪费一个资源(资源是非常珍贵的).要知道这里所说的一个资源不仅仅代表一个下标,而是指数组中的元素,这个元素可能代表某个系统的第一个状态值,也可以代表磁盘上的第一个簇,也可以代表第一个航班,等等.
这听起来好像与效率无关,其实不然,要知道C语言产生的时候,总是硬件支持什么数据类型,它就支持什么数据类型.硬件支持最大16位整数,就无法表示65536这个数.即使只定义了10个元素,下标从1开始,那么程序在用1做为下标访问元素时,也得先减1使其变成0之后再取0号元素,本来只需要3个指令能完成的动作,现在要4个指令才能完成,换句话说,因为用1做下标,本来8个小时的工作,就要变成要加班两个多小时才能干完.这也是为什么多数单片机都支持C语言而不是Pascal的原因之一.
hackyxd 2008-01-31
  • 打赏
  • 举报
回复
71楼是瞎侃的吧。。。
晓风残月0110 2008-01-31
  • 打赏
  • 举报
回复
老外喜欢说yes
中国人则说是
自然数不是也从0开始吗,
都一样习惯问题
kprzen 2008-01-31
  • 打赏
  • 举报
回复
a[n] <==> *(a + n)
这个等价是有编译器决定的,你现在用的是标准的编译器,哪你就的按照人家的规则.

如果你想:a[n] <==> *(a + n + 1)
你可以自己弄编译器.(我想是没必要的)
星光伴月 2008-01-31
  • 打赏
  • 举报
回复
TO 69楼:
既然大家都热心地回复了,你就好好看看吧.多看看多想想肯定有好处的.
welling007 2008-01-31
  • 打赏
  • 举报
回复
......无语
liufangbj 2008-01-31
  • 打赏
  • 举报
回复
跑哪去了~~
王渝伦 2008-01-31
  • 打赏
  • 举报
回复
以上统统都错!!!
其实c语言之父也在后悔这个问题呢,,他也后悔没把数组下表定义成从1开始,导致了程序员由于粗心大意而产生的无数错误.
但是语言推广了之后,大多数程序员已经习惯了从0开始,再想改也该不过来了~
yyne 2008-01-31
  • 打赏
  • 举报
回复
若楼主看完以上答案仍有疑惑,那么这个疑惑并不是你个人的。

在计算机世界里,只存在两个数位,0和1。0代表短路,1代表通路,这就是千千万万年来的科学极限,这个极限缔造了当今的数字帝国。

楼主,太阳出来了,您该上床睡觉了。
yyne 2008-01-31
  • 打赏
  • 举报
回复
0,作用一个特殊数位,它有着不可替代的用途与意义(毕竟是N多杰出科学家冥思苦想若干世纪的产物)。

首先,0表示数位,10、100、1000,等等;
其次,0代表界限,0下n度、0上n度,等等;
再者,0代表起点,.... ... ... ,等等;
...,0代表...,.... .... ...,等等等...
yyne 2008-01-31
  • 打赏
  • 举报
回复
我来专业地解释一下吧:

位值的概念要归功于公元前2000年以前(具体时间无法追溯)的巴比伦人和玛雅人。

之后巴比伦人又在公元前1900~1800年开始,冥思苦想了若干世纪,最后才终于发明了代表“0”的符号。

0的问题已经独立成了专门的学科,0给我们带来的好处与坏处实在太多太多(比如公元0年份的计算此类)。

我们不能扼杀人类的智慧结晶与历史意义,所以要坚持保留这个0(只是说笑)。

人类不会因为让某些少数的需要而去除或更改0的概念与用途,因为“0开始”是所有物理与科学的基础。

而“1开始”只是楼主或少数人的需要,楼主茅塞顿开了么?
加载更多回复(61)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧