社区
C语言
帖子详情
为什么数组下标要是0到N-1,而不是1到N?
SHOUYU2
2008-01-29 03:26:48
为什么数组下标是0到N-1而不是1到N?
这样可以避免一些不小心的错误和方便记忆啊。
...全文
1287
81
打赏
收藏
为什么数组下标要是0到N-1,而不是1到N?
为什么数组下标是0到N-1而不是1到N? 这样可以避免一些不小心的错误和方便记忆啊。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
己知循环队列存储在一维
数组
A[0…n-1]中。
【2011年全国试题3】已知循环队列存储在一维
数组
A[0…n-1],且队列非空时,front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是(B) A. 0, 0 B. 0, n-1 C. n-1, 0 D. n-1, n-1 要求第一个进入队列的元素储存在A[0],故初始时front指向0。 又因为队列非空时,front和rear分别指向队头元素和队尾元素。而此时
数组
下标
为-1的意义
数组
下标
为-1的地址对于
数组
来说是越界访问了,但是这个地址是有意义的 这个地址就是所申请的
数组
存储空间的首地址的向前偏移一个单位(也就是偏移一个当前
数组
类型所对应的字节数)所对应的地址。 这个地址由于没有跟着
数组
空间一起初始化,所以其中的数据是不一定的, 如果是正在被系统或者其他APP使用中的地址空间,那么可以被访问,其中的数据的意义取决于被系统或者其他APP所写入的数据,但是访问后
【2011年全国试题3】已知循环队列存储在一维
数组
A[0…n-1],且队列非空时,front和rear分别指向队头元素和队尾元素。若初始时队列为空,且
【2011年全国试题3】已知循环队列存储在一维
数组
A[0…n-1],且队列非空时,front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是(B) A. 0, 0 B. 0, n-1 C. n-1, 0 D. n-1, n-1 首先理解"队列非空时,front和rear分别指向队头元素和队尾元素"。当队列中有一个元素时,front与rear都需要指向A[0...
C语言
数组
下标
-1你见过吗?
不知道你有没有见过-1作为
数组
下标
的,我算是见到了。当然这一点在Python之类的语言中毫不稀奇。
下标
-1的代码 这里redis源码中的一部分: sdssdsMakeRoomFor(sdss,size_taddlen){ void*sh,*newsh; size_tavail=sdsavail(s); size_tlen,newlen; chartype,oldtype=s[-1]&SDS_TYPE_MASK; ...
C语言
数组
居然有[-1]
下标
?
1.背景 最近在查阅代码(C)时出现类似“a[-1]”的操作,以过往的经验,觉得是非法的访问
数组
操作,第一反应就是不存在这样的语句,连编译都通不过。实质上,这是完全没问题的语句,编译和执行都是不存在问题,当然也可能与编译器相关。 void fun(char *a) { a++; printf("%c\n",a[-1]); } 2.a[-1]涵义 2.1 案例分析 “[]”一般用...
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章