为什么数组订阅操作符可以双向工作
Why array subscription operator works both ways?
为什么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]
)完全相同-您引用的对象的最终地址是相同的。一种符号对人类来说比另一种更直观。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 我怎样才能让getline操作符工作
- c++ array[]操作符抛出不工作
- 重载*操作符,使其在左右两边都工作
- c++操作符的内部工作原理
- 类中的操作符是如何工作的
- 解引用操作符(*)作为类的成员函数重载时是如何工作的?
- 操作符重载在没有引用的情况下可以工作吗?
- 如何使重载操作符与指针一起工作
- 空体的重载操作符神奇地工作了
- c和c++中sizeof操作符的工作方式不同吗?
- std::set的操作符重载不能正常工作
- 模板重载=操作符在一个类中工作,在另一个类中无法编译
- c++模板操作符+如何使不同的实例与它一起工作
- 这个优先级操作符是如何工作的
- 重载操作符在方法中不工作
- 为什么数组订阅操作符可以双向工作
- c++用户定义操作符<不能正常工作
- 字符串class ==操作符不能正常工作