C ++编程语言中数组索引的类型是什么?例如在这样的陈述中:
int tab[5];
转换为什么类型5?或者它只是简单的int?
答案 0 :(得分:13)
在该代码中,5
只是一个普通的整数文字,所以这里只是一个普通的int
。
§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 吗?或索引到一个数组? 声明的数组的大小必须大于零;它可以是任何整数类型:int
,char
,signed char
,unsigned 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)。
常量表达式是一个整数常量表达式,如果它是 积分或枚举类型。 [注意:这些表达可以用作 数组边界(8.3.4,5.3.4),作为case表达式(6.4.2),作为位字段 长度(9.6),......
5
是整数文字(§2.14.2)。它的类型是int
。
2整数文字的类型是对应的第一个 表6中的列表,其值可以表示。
3如果是 整数文字不能用其列表中的任何类型表示 扩展整数类型(3.9.1)可以表示它的值,它可能有 那个扩展的整数类型。 ......
表6中没有后缀的十进制常量类型包括:int
,long int
,long long int
。
答案 3 :(得分:3)
如果您需要不同的类型使用后缀,则为int
,例如:
5 // int
5u // unsigned int
5l // long
5ul // unsigned long