Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么阵列订阅操作符可以双向工作? 为什么C++允许下面的语句?_C++ - Fatal编程技术网

为什么阵列订阅操作符可以双向工作? 为什么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,请检查我的编辑。希望这有用。