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

ein*_*ica 4 c++ arrays standards pointers subscript-operator

在C中,阵列订阅:a[b]仅仅是还原糖等效指针运算之后解除引用的句法:*(a+b)(如所解释的,比方说,在这里).

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

Sha*_*our 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 ;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @JamesKanze实际上你的意思是`10 [数组]`语法不允许`[10]数组`. (2认同)

NPE*_*NPE 3

C++ 在这方面与 C 完全相同。C++11\xc2\xa75.2.1:

\n\n
\n

该表达式E1[E2]与(通过 de\xef\xac\x81nition)相同*((E1)+(E2))

\n
\n