c ++,数组索引需要是int吗?

时间:2014-08-10 18:21:46

标签: c++ arrays

在c ++中,const数组arr包含0到80之间的100个数字。

如果我选择arr中的数字为char s,每次将它们用作双指针的索引时,它们是否会隐式转换为int,即{{1} }?

4 个答案:

答案 0 :(得分:4)

是的,它们将转换为int类型。根据C ++标准"下标operator []被解释为E1 [E2]与*((E1)+(E2))相同。" 如果使用加法运算符,那么"执行通常的算术转换 算术或枚举类型的操作数。"这意味着char类型的对象在表达式中用作下标运算符中的索引时将转换为int类型的对象。

考虑到char类型可能表现为unsigned char或signed char,具体取决于您将选择的编译器选项或默认设置的编译器选项。

对于可以在下标运算符中用作索引的类型,它们应该是无范围的枚举或某些整数类型。

答案 1 :(得分:1)

对于真正的数组,索引是(转换为)某种整数类型,如Vlad's answer中所述。

但有几个STL容器,例如std::mapstd::vector有自己的operator [],其参数可能是(例如某些map - s)非整数类型。按照惯例,该运算符可能与某些at成员函数相关。

答案 2 :(得分:0)

不,没有必要将int作为数组的索引。您可以将字符作为数组索引,但它们有自己的问题。 Char索引可能会产生问题,因为它们可能是有符号或无符号的,具体取决于实现。如果一个 用户提供的字符用作数组索引,它是可能的 价值是负的,在大多数情况下,这意味着记忆 将访问数组外部。因此,它会导致不必要的混乱。因此推荐使用int,并且主要用作数组索引

答案 3 :(得分:0)

要回答标题中的问题,数组索引可以是任何“无范围枚举或整数类型”。数组索引是根据指针添加来定义的;一个操作数必须是指向完全定义的对象类型的指针,另一个操作数必须是一些完整或无范围的枚举 类型。

(注意,这里的“对象”一词与面向对象的编程无关。)

在此上下文中,类型int没有什么特别之处。当您定义数组类型或对象时,不指定索引的类型,只指定元素类型和元素数。使用索引表达式arr[i]时,索引可以是任何整数类型;例如unsigned intlong long有效,不会被隐式转换。

要解决您所询问的特定代码,char是一个整数类型,因此它作为数组索引完全有效 - 但您需要小心。 “通常的算术转换”应用于索引表达式,这意味着如果它的类型比int窄,则会将其提升为intunsigned int。这些促销不适用于类型已至少与int一样宽的索引。

如果您的实施中碰巧签署了char,并且该值恰好为负值,那么它将被提升为否定 int值,可能不是你想要的。在您的特定情况下,您说值介于0到80之间,所有这些值都在类型char的正值范围内。但是,如果您的需求稍后更改,最好使用元素类型unsigned char定义数组。