C# 中负数组索引的行为

Posted

技术标签:

【中文标题】C# 中负数组索引的行为【英文标题】:Behaviour of negative array index in C# 【发布时间】:2018-07-13 20:50:44 【问题描述】:

我是 C# 的新手。我知道 C 和 C++ 语言。目前我有一个 C# 相关的项目。所以,我只想知道关于 C# 的基本概念。

在 C# 中,如果我给出负数组索引,那么会发生什么?是未定义的行为吗?

喜欢:

int [] arr = 1,2,3;
Console.WriteLine("0", arr[-1]);

【问题讨论】:

为什么不简单地尝试一下呢?我认为我们可以期望 14k 用户至少知道您可能会在 Stack 上提出什么样的问题以及如何这样做。 【参考方案1】:

只要索引超出该数组的有效索引范围,您的程序就会抛出 IndexOutOfRangeException 异常。

如果您花一点时间尝试一下,您就会亲眼看到。

【讨论】:

【参考方案2】:

如果您访问超出其索引范围的数组,您将收到 System.IndexOutOfRangeException。 对于任何负索引或任何大于或等于 array.Length 的索引,都会出现此异常。

【讨论】:

【参考方案3】:
int [] arr = 1,2,3;

编译器会将上述语法糖在内部转换为

 int [] arr = new int[] 1,2,3;

所以编译器会自动计算 arr 长度为 3。

编译器不允许你定义未知大小的数组。

int[] arr=new int[];//compiler error,array creation must have size.

所以下面的语句

Console.WriteLine(arr[-1]);

将抛出 “System.IndexOutOfRangeException”类型的未处理异常

【讨论】:

arr=1,2,3 内部将被转换为 int[]。还有为什么 -1 是不允许的,因为数组索引从 0 开始,那是因为它在内部使用指针并且低于 0是垃圾值,因此编译器警告不要给出无效的索引。而且我正在绑定移动设备之前没有看到你的答案。

以上是关于C# 中负数组索引的行为的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用 Index 和 Range 简化集合操作

数组的某一维的索引为负数

为啥模运算符的行为与数学派系 MOD 不同

Python列表/数组:禁用切片中的负索引环绕

C#中数组遍历的例子

指数超出范围。必须是非负数且小于集合的大小。参数名称:索引