4

在 C 语言中,数组订阅:a[b]仅仅是指针算术后解引用的语法糖等价物:(*(a+b)如解释,here)。

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

4

2 回答 2

7

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

C++ E1[E2]等同*((E1)+(E2))

C++ 期望以什么类型显示为下标?

C++需要一个无范围的枚举或整数类型,这两个项目都包含在草稿 C++ 标准部分下5.2.1 1段中,它说(强调我的):

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

正如詹姆斯指出的那样,表达式之一应具有的措辞允许指针下标互换,例如:

#include <iostream>

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

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

不建议使用替代语法2[arr],大多数人不会知道这是做什么的,这会使代码的可读性降低,因此可维护性也降低。

这类似于草案 C99 标准 6.5.2.1 数组下标2段中的相关部分,其中说(强调我的):

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

于 2013-12-04T14:54:57.660 回答
3

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

表达式E1[E2]与(定义)相同*((E1)+(E2))

于 2013-12-04T14:53:24.300 回答