为什么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
答案 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]
)非常相似 - 您引用的对象的最终地址是相同。一种符号对人类而言比另一种符号更直观。