最近在用二分法的时候在想一个问题,数组为什么通过下标可以直接访问到下标里面值。跟着前端后台的同事一起讨论了一下这个问题。
发现一个有趣的点,对于 数组或者说python列表
array_value = [1,2,3,4,5,6]
对于python来说,array_value[-1]代表访问最后一个数的数值
对于Java而言,array_value[-1]代表数组越界
对于C语言来说,array_value[-1]代表访问到下一地址

首先对于python来说,-1 为什么可以访问最后一位数据来分析
在网上找了相关资料了解了一下,可以使用负数访问的原因是首地址向左移一位,但是我个人觉得这个说法不太可靠,为什么?
以array_value = [1,2,3,4,5,6] 来举例,当初始化这个列表时,编译器会向系统请求一片连续的地址给列表 array_value,这个地址可以使用print(id(array_value))进行查看。
但是对于有人说是左右移位的说法,我还是不太相信。于是我自己找了一个相对可靠的说法。将列表的长度的数值,设置高位为符号位
比如一个8个元素的列表,下表只能是0到7。但是用2进制来7则是
0x0111 那对应的负数下标为-1 则这个值是原码的补码。这个才是最合理的解释。 原码:0x0111 反码:0x1000 补码:0x1001 nice

然后在网上也搜索了关于为什么直接访问下表可以访问的数组中的元素。从汇编语言的角度来讲,如果访问下标为array_value[5],则是相对于首地址array_value向前偏移了5个地址,然后访问地址里面的值
经过反复验证,我的想法是错的,因为一旦上了下表为8的时候,上述均被推翻,所以这块容我再想想…

总结:思考是一个验证过程,大多数的时候总是喜欢用期望的数据的出结论,事实上多用几组数据去判定去验证会得到不一样的效果。但是建议不要写-1写习惯了,虽然常用。但是很容易带到其它语言去。所以建议还是不要。然后如果是方位的是未知的列表或数组,建议先判空,再做处理