C ++对数组下标有什么期望?

时间:2013-12-04 14:50:52

标签: c++ arrays pointers standards subscript-operator

在C中,数组预订:a[b]仅仅是指针算术后解除引用的语法糖:*(a+b)(如所解释的那样,here)。

对于基类型,如何在C ++中解释数组订阅? (不适用于我们有超载语义的类)?而且,更具体地说,C ++期望作为下标出现什么类型?是ptrdiff_t吗?

2 个答案:

答案 0 :(得分:6)

  

如何在C ++中解释数组订阅,

C ++中 E1[E2] 相同*((E1)+(E2))

  

C ++期望以什么类型出现作为下标?

C ++ 期望无范围枚举或整数类型 draft C++ standard部分5.2.1 订阅中涵盖了这两个项目段落 1 表示(强调我的):

  

后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式应具有“指向T的指针”类型,其他表达式应具有无范围枚举或整数类型。结果是类型“T”的左值。类型“T”应该是完全定义的对象类型。 62 表达式E1 [E2]相同(根据定义)* ((E1)+(E2)) [注:有关数组的详细信息,请参阅5.3和5.7了解*和+和8.3.4的详细信息。 - 后注]

正如詹姆斯所指出的,措辞其中一个表达式允许指针下标互换,例如:< / p>

#include <iostream>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5 } ;

    std::cout << arr[2] << ":" << 2[arr] << std::endl ;
}

不推荐使用替代语法2[arr],大多数人都不知道这是做什么的,这使得代码的可读性降低,因此维护性较差。

类似于draft C99 standard 6.5.2.1 数组下载 2 中的相关部分,其中说明了强调我的):

  

后缀表达式后跟方括号[]中的表达式是下标   指定数组对象的元素。下标运算符[]的定义    E1 [E2]与(*((E1)+(E2)))相同。由于转换规则   应用于二进制+运算符,如果E1是一个数组对象(等效地,指向   数组对象的初始元素),E2是整数,E1 [E2]表示E2-th   E1的元素(从零开始计数)。

答案 1 :(得分:3)

在这方面,C ++与C完全相同。 C ++11§5.2.1:

  

表达式E1[E2]*((E1)+(E2))

相同(通过定义)