C ++中的数组索引类型

时间:2011-11-13 12:00:08

标签: c++ arrays

C ++编程语言中数组索引的类型是什么?例如在这样的陈述中:

int tab[5];

转换为什么类型5?或者它只是简单的int?

4 个答案:

答案 0 :(得分:13)

在该代码中,5只是一个普通的整数文字,所以这里只是一个普通的int

n3290(~C ++ 11)中的

§8.3.4 Arrays 指定了数组声明符:

  

在声明T D中,D的格式为

D1 [ constant-expressionopt ] attribute-specifier-seqopt
     

并且声明T D1中的标识符的类型是“derived-declarator-type-list T”,则D的标识符的类型是数组类型;如果D的标识符类型包含auto类型说明符,则程序格式错误。 T称为数组元素类型;此类型不应是引用类型,(可能是cv限定的)类型void,函数类型或抽象类类型。如果存在常量表达式(5.19),则应为整数常量表达式,其值应大于零

§5.2.1订阅描述了表达式括号中的内容:

  

后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式应具有“指向T的指针”,另一个表达式应具有 unscoped枚举或整数类型。   结果是类型“T”的左值。类型“T”应该是完全定义的对象类型。表达方式   E1 [E2]与*((E1)+(E2))

相同(根据定义)

答案 1 :(得分:5)

这个问题有些令人困惑。标题提到数组索引的类型,但在问题中,你似乎问了别的东西。你在问一个数组的 size 吗?或索引到一个数组? 声明的数组的大小必须大于零;它可以是任何整数类型:intcharsigned charunsigned int等。在您的问题中,文字5的类型为int

但是,如果您询问数组的 index 的类型,那么它必须是整数类型之一。数组的索引类型也可以是int,因为它甚至可以是负数。

int a[10][10];

int x = a[3][-1]; //same as a[2][9]
int y = a[3][-2]; //same as a[2][8]
int z = a[3][-3]; //same as a[2][7]

答案 2 :(得分:4)

int tab[5];是一个数组声明。

数组声明接受一个值大于零的整型常量表达式(c ++ 11:§8.3.4)。

§5.19.4(n3242):

  

常量表达式是一个整数常量表达式,如果它是   积分或枚举类型。 [注意:这些表达可以用作   数组边界(8.3.4,5.3.4),作为case表达式(6.4.2),作为位字段   长度(9.6),......


5是整数文字(§2.14.2)。它的类型是int

§2.14.2(n3242)

  

2整数文字的类型是对应的第一个   表6中的列表,其值可以表示。

  

3如果是   整数文字不能用其列表中的任何类型表示   扩展整数类型(3.9.1)可以表示它的值,它可能有   那个扩展的整数类型。 ......

表6中没有后缀的十进制常量类型包括:intlong intlong long int

答案 3 :(得分:3)

如果您需要不同的类型使用后缀,则为int,例如:

5         // int
5u        // unsigned int
5l        // long
5ul       // unsigned long