在c ++中,const数组arr
包含0到80之间的100个数字。
如果我选择arr
中的数字为char
s,每次将它们用作双指针的索引时,它们是否会隐式转换为int
,即{{1} }?
答案 0 :(得分:4)
是的,它们将转换为int
类型。根据C ++标准"下标operator []被解释为E1 [E2]与*((E1)+(E2))相同。"
如果使用加法运算符,那么"执行通常的算术转换
算术或枚举类型的操作数。"这意味着char类型的对象在表达式中用作下标运算符中的索引时将转换为int类型的对象。
考虑到char类型可能表现为unsigned char或signed char,具体取决于您将选择的编译器选项或默认设置的编译器选项。
对于可以在下标运算符中用作索引的类型,它们应该是无范围的枚举或某些整数类型。
答案 1 :(得分:1)
对于真正的数组,索引是(转换为)某种整数类型,如Vlad's answer中所述。
但有几个STL容器,例如std::map或std::vector有自己的operator []
,其参数可能是(例如某些map
- s)非整数类型。按照惯例,该运算符可能与某些at
成员函数相关。
答案 2 :(得分:0)
不,没有必要将int作为数组的索引。您可以将字符作为数组索引,但它们有自己的问题。 Char索引可能会产生问题,因为它们可能是有符号或无符号的,具体取决于实现。如果一个 用户提供的字符用作数组索引,它是可能的 价值是负的,在大多数情况下,这意味着记忆 将访问数组外部。因此,它会导致不必要的混乱。因此推荐使用int,并且主要用作数组索引
答案 3 :(得分:0)
要回答标题中的问题,数组索引可以是任何“无范围枚举或整数类型”。数组索引是根据指针添加来定义的;一个操作数必须是指向完全定义的对象类型的指针,另一个操作数必须是一些完整或无范围的枚举 类型。
(注意,这里的“对象”一词与面向对象的编程无关。)
在此上下文中,类型int
没有什么特别之处。当您定义数组类型或对象时,不指定索引的类型,只指定元素类型和元素数。使用索引表达式arr[i]
时,索引可以是任何整数类型;例如unsigned int
和long long
有效,不会被隐式转换。
要解决您所询问的特定代码,char
是一个整数类型,因此它作为数组索引完全有效 - 但您需要小心。 “通常的算术转换”应用于索引表达式,这意味着如果它的类型比int
窄,则会将其提升为int
或unsigned int
。这些促销不适用于类型已至少与int
一样宽的索引。
如果您的实施中碰巧签署了char
,并且该值恰好为负值,那么它将被提升为否定 int
值,可能不是你想要的。在您的特定情况下,您说值介于0到80之间,所有这些值都在类型char
的正值范围内。但是,如果您的需求稍后更改,最好使用元素类型unsigned char
定义数组。