在C中,数组预订:a[b]
仅仅是指针算术后解除引用的语法糖:*(a+b)
(如所解释的那样,here)。
对于基类型,如何在C ++中解释数组订阅? (不适用于我们有超载语义的类)?而且,更具体地说,C ++期望作为下标出现什么类型?是ptrdiff_t
吗?
答案 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)
表达式
相同(通过定义)E1[E2]
与*((E1)+(E2))