【问题标题】:Type of array index in C++C++中数组索引的类型
【发布时间】:2011-12-28 00:32:09
【问题描述】:

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

int tab[5];

5 转换成什么类型​​?或者它只是普通的 int?

【问题讨论】:

标签: c++ arrays


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个问题有点令人困惑。标题中提到了数组索引的类型,但在问题中,您似乎问的是其他问题。您是在询问数组的 size 吗?或 index 到一个数组? 声明的数组的大小必须大于零;它可以是任何整数类型: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]
    

    【讨论】:

    • c++11 标准(n3242 草案)§8.3.4 规定该值应大于零。
    • @J.F.Sebastian:如果值应该大于零,那么写a[0][0]是非法的吗?我认为您将数组的索引数组的大小 混淆了。 size 必须大于零!
    • “数组的大小必须大于零”——这不是真的。只有声明的数组才是真的。例如这很好:new int[0].
    • @Nawaz:您注意到的问题中的代码是一个数组声明。我以为您指的是可能的值而不是5。没错,我混淆了数组的索引和大小。
    • @JohannesSchaub-litb:我同意这一点。但是问题提到了声明的数组,所以我只回答了那部分。更详细的答案可能包括类型可以是任何类型,如果它是重载 operator[] 的用户定义类。
    【解决方案3】:

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

    §8.3.4 Arrays in n3290 (~ C++11) 指定数组声明符:

    在声明 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 的指针”类型,而另一个应具有 无作用域枚举或整数类型。 结果是“T”类型的左值。类型“T”应该是一个完全定义的对象类型。表达方式 E1[E2] 与 *((E1)+(E2)) 相同(根据定义)

    【讨论】:

    • 错误的章节。他询问声明,您引用下标表达式描述。这是不同的,因为对于他的情况,不允许负整数值。因此,是否适用相同的约束并不明显。
    • @JohannesSchaub-litb:为声明器添加了相关部分。我认为这个问题不是专门针对声明部分的,这就是我将下标部分作为参考的原因。
    • @Johannes Schaub - litb:公平地说,标题是C++ 中的数组索引类型。我已经在my answer 中介绍了数组声明部分。
    【解决方案4】:

    这是int,如果你想要不同的类型使用后缀,例如:

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

    【讨论】:

    • 注意:不带后缀的整型字面量可以是intlong intlong long int,也可以是扩展整型。请参阅my answer,例如,5000000000 在我的机器上是 long,在 ideone.com 上是 long long
    猜你喜欢
    • 2013-05-05
    • 2016-11-07
    • 2018-04-27
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    相关资源
    最近更新 更多