为什么数组订阅运算符双向工作?

时间:2016-06-30 16:37:19

标签: c++

为什么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

2 个答案:

答案 0 :(得分:4)

这是因为指针算术:

a[1] == *(a+1) == *(1+a) == 1[a];

引用标准(§8.3.4;第6点):

  

除了为类声明它之外,下标运算符[]的解释方式是E1[E2]*((E1)+(E2))相同。由于适用于+的转化规则,如果E1是数组且E2是整数,那么E1[E2]指的是E2成员E1。因此,尽管外观不对称,但下标是一种可交换的操作。

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

答案 1 :(得分:1)

两者都很好,因为它只是指针算法。获取某些内容并向其添加其他内容(a[1)与获取其他内容并向其添加地址(1[a])非常相似 - 您引用的对象的最终地址是相同。一种符号对人类而言比另一种符号更直观。