在C中,阵列订阅:a[b]
仅仅是还原糖等效指针运算之后解除引用的句法:*(a+b)
(如所解释的,比方说,在这里).
对于基类型,如何在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)))相同.由于适用于binary +运算符的转换规则,如果E1是数组对象(等效地,指向数组对象的初始元素的指针)并且E2是整数,则E1 [E2]指定E2的第E2个元素. E1(从零开始计数).