为什么数组订阅操作符可以双向工作

Why array subscription operator works both ways?

本文关键字:工作 操作符 数组 为什么      更新时间:2023-10-16

为什么c++允许以下语句?

  int a[10] = { 0 };
  std::cout << 1[a] << std::endl;
  std::cout << a[1] << std::endl;

两行都输出零,并且不生成编译器警告。1[a]不应该是非法的,因为1不是数组,a不是整数类型。

代码示例:http://cpp.sh/4tan

这是因为指针运算:

a[1] == *(a+1) == *(1+a) == 1[a];
引用标准(§8.3.4;6):

下标操作符[]被解释为E1[E2]*((E1)+(E2))相同,除非它已被声明为一个类。由于适用于+的转换规则,如果E1是数组,E2是整数,则E1[E2]指向E1的第E2成员。因此,尽管下标看起来不对称,但它是一个交换运算。

注意,当你写a[1]时,编译器将其解释为*(a+1)。当您编写1[a]时,您仍然引用相同的数组a,因此编译器实际上仍然进行类型检查

这两种方法都很好,因为在幕后都只是指针运算。获取某个对象的地址并向其添加其他对象(a[1)与获取其他对象并向其添加地址(1[a])完全相同-您引用的对象的最终地址是相同的。一种符号对人类来说比另一种更直观。