C++中的数组索引类型

scd*_*dmb 16 c++ arrays

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

int tab[5];
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*Mat 13

在该代码中,5只是一个普通的整数文字,所以它只是一个简单的int.

§8.3.4 阵列在n3290(〜C++ 11),用于指定组声明:

在TD的声明中,D表格

D1 [ constant-expressionopt ] attribute-specifier-seqopt
Run Code Online (Sandbox Code Playgroud)

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

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

后缀表达式后跟方括号中的表达式是后缀表达式.其中一个表达式应具有"指向T的指针"类型,另一个表达式应具有未映射的枚举或整数类型.结果是类型"T"的左值.类型"T"应该是完全定义的对象类型.表达式E1 [E2]与*((E1)+(E2))相同(根据定义)


Naw*_*waz 5

这个问题有些令人困惑.标题提到数组索引的类型,但在问题中,你似乎问了别的东西.你在询问阵列的大小吗?或索引到数组?声明的数组的大小必须大于零 ; 它可以在任何整数类型:int,char,signed char, unsigned int,等.在你的问题中,文字的类型5int.

但是,如果您询问数组的索引类型,那么它必须是整数类型之一.数组的索引类型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]
Run Code Online (Sandbox Code Playgroud)

  • @JFSebastian:如果值*应大于零*,那么就意味着写“a[0][0]”是非法的?我认为您将*数组的索引*与*数组的大小*混淆了。它是*大小*,必须大于零! (2认同)
  • “数组的大小必须大于零”——这实际上是不正确的。仅对于声明的数组才是正确的。例如,这很好:“new int[0]”。 (2认同)

jfs*_*jfs 5

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

\n\n

数组声明接受值大于零的整型常量表达式(c++11: \xc2\xa78.3.4)。

\n\n

\xc2\xa75.19.4 (n3242):

\n\n
\n

如果常量表达式是整型或枚举类型,则该常量表达式是整型常量表达式。[ 注意:此类表达式可用作数组边界 (8.3.4、5.3.4)、case 表达式 (6.4.2)、位字段长度 (9.6)、...

\n
\n\n
\n\n

5是整数文字 (\xc2\xa72.14.2)。它的类型是int.

\n\n

\xc2\xa72.14.2 (n3242)

\n\n
\n

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

\n
\n\n

\n\n

\n

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

\n
\n\n

表 6 中不带后缀的十进制常量类型为:intlong intlong long int

\n