在 C 语言中,数组订阅:a[b]
仅仅是指针算术后解引用的语法糖等价物:(*(a+b)
如解释,here)。
对于基本类型,如何在 C++ 中解释数组订阅?(不适用于我们有重载语义的类)?而且,更具体地说,C++ 期望以什么类型作为下标出现?是ptrdiff_t
吗?
数组订阅如何在 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(从零开始计数)。
在这方面,C++ 与 C 完全相同。C++11 §5.2.1:
表达式
E1[E2]
与(定义)相同*((E1)+(E2))