我在网上看到了这个,并且想知道是否有人能够解释这个或者至少给我一个可能的名称,这样我至少可以知道我在谷歌上搜索。
int main()
{
int myarray[4] = {0, 100, 200, 300};
2[myarray] = -999; //why does this work? what is this called?
for ( int i = 0; i < 4; i++)
cout << myarray[i] << endl;
}
输出为0,100,-999,300
我跑了。我知道它有效,但为什么呢?这个叫什么?
答案 0 :(得分:8)
原因是arr[n]
== *(arr + n)
。
但是,因为添加是可交换的,*(arr + n)
== *(n + arr)
。因此,*(n + arr)
== n[arr]
== *(arr + n)
== arr[n]
。
值得一提的是*(arr + n)
仍然有点误导。在汇编中,它实际上意味着*(arr + (n * s))
其中s
是sizeof arr[0]
,但这是隐蔽的,所以你不必担心它。
答案 1 :(得分:3)
我不认为这种特殊的[ab-]指针运算规则的使用有任何特殊的名称。它完全不符合C和C ++中定义指针算法的方式。这两种语言标准都没有做出任何特殊的尝试来阻止下标和指针的反转。例如,相关的C ++规则在5.2.1 [expr.sub]段落1:
中后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式应具有“T的数组”类型或“指向T的指针”,另一个表达式应具有未映射的枚举或整数类型。结果是“T”类型。“T”类型应是完全定义的对象类型。表达式E1 [E2]与*((E1)+(E2))相同(注意:有关数组*和+和8.3.4的详细信息,请参见5.3和5.7。 -end note],除了在数组操作数的情况下,如果该操作数是左值,则结果为左值,否则为x值。
它可以 寻找&#34; C ++ 5.2.1&#34;或&#34; C ++ [expr.sub]&#34;但是,逆转的使用并不会让那些在C或C ++上看起来不够长的人感到困惑。