为什么阵列订阅操作符可以双向工作? 为什么C++允许下面的语句?
为什么阵列订阅操作符可以双向工作? 为什么C++允许下面的语句?,c++,C++,int a[10] = { 0 }; std::cout << 1[a] << std::endl; std::cout << a[1] << std::endl; inta[10]={0}; std::cout这是因为指针算法: a[1] == *(a+1) == *(1+a) == 1[a]; 引用标准(§8.3.4;第6点): 除非已为类声明,否则下标运算符[]的解释方式应确保E1[E2]与*((E1)+(E2))相同。由于应用于
int a[10] = { 0 };
std::cout << 1[a] << std::endl;
std::cout << a[1] << std::endl;
inta[10]={0};
std::cout这是因为指针算法:
a[1] == *(a+1) == *(1+a) == 1[a];
引用标准(§8.3.4;第6点):
除非已为类声明,否则下标运算符[]
的解释方式应确保E1[E2]
与*((E1)+(E2))
相同。由于应用于+
的转换规则,如果E1
是一个数组,E2
是一个整数,那么E1[E2]
指的是E2
的第四个成员。因此,尽管其外观不对称,但下标是一种交换操作
请注意,当您编写a[1]
时,编译器将其解释为*(a+1)
。编写1[a]
时,您仍然引用同一数组a
,因此编译器实际上仍在进行类型检查。这是因为指针算法:
a[1] == *(a+1) == *(1+a) == 1[a];
引用标准(§8.3.4;第6点):
除非已为类声明,否则下标运算符[]
的解释方式应确保E1[E2]
与*((E1)+(E2))
相同。由于应用于+
的转换规则,如果E1
是一个数组,E2
是一个整数,那么E1[E2]
指的是E2
的第四个成员。因此,尽管其外观不对称,但下标是一种交换操作
请注意,当您编写a[1]
时,编译器将其解释为*(a+1)
。当您编写1[a]
时,仍然引用相同的数组a
,因此编译器实际上仍在进行类型检查。两者都很好,因为它们都只是指针算术。获取某物的地址并向其添加其他内容(a[1
)与获取其他内容并向其添加地址(1[a]
)完全相同-您引用的对象的最终地址是相同的。一种表示法对人类来说比另一种更直观。两者都很好,因为在封面下都是指针运算。获取某个对象的地址并向其添加其他内容(a[1
)与获取其他内容并向其添加地址完全相同(1[a]
)你所指的对象的最终地址是相同的。一个符号比人类更直观。< /P>因为指针运算。请询问C标准,C++是因为指针运算而得到的算术。请询问C标准,C++在那里得到它的算术,但为什么不执行任何类型检查。ing?最好用==
?断言(a[1]=*(a+1)=*(1+a)==1[a]);
@BatCoder我认为OP假设运算符[]
仅对重载运算符的指针类型、数组类型和用户定义类型有效。但如问题所示,它不是。@Giuseppe-它进行类型检查。但作为a[b]
与*(a+b)
相同,a
和b
的顺序无关紧要。@Giuseppes,请检查我的编辑。希望这有用。我明白了,但为什么它不执行任何类型检查?也许最好用=
说明断言(a[1]=*(a+1)=*(1+a)==1[a]);
@BatCoder我认为OP假设运算符[]
仅对重载运算符的指针类型、数组类型和用户定义类型有效。但如问题所示,它不是。@Giuseppe-它进行类型检查。但是作为a[b]
与*(a+b)相同
,a
和b
的顺序无关紧要。@Giuseppes,请检查我的编辑。希望这有用。