C++反转索引器和数组的名称

C++ reversing indexer and name of array

本文关键字:数组 索引 C++      更新时间:2023-10-16

我在网上看到了这个,想知道是否有人能解释一下,或者至少给我一个名字,这样我至少可以知道我在谷歌上搜索什么。

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-999300

我试过了。我知道它有效,但为什么?这叫什么?

之所以出现这种情况,是因为arr[n]==*(arr + n)

然而,因为加法是可交换的,所以*(arr + n)==*(n + arr)。因此,*(n + arr)=n[arr]=*(arr + n)=arr[n]

值得一提的是,*(arr + n)仍然有点误导性。在汇编中,它实际上意味着*(arr + (n * s)),其中ssizeof arr[0],但这是隐藏的,所以你不需要担心。

我不认为指针算术规则的这种特殊[ab-]使用有任何特定的名称。它只是偏离了C和C++中定义指针算术的方式。这两种语言标准都没有做出任何特殊的尝试来防止下标和指针的反转。例如,相关C++规则见5.2.1[expr.sub]第1段:

后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式的类型应为"T的数组"或"指向T的指针",另一个表达式应为无范围枚举或整数类型。结果为"T"类型。"T"应为完全定义的对象类型。表达式E1[E2](根据定义)与*((E1)+(E2))相同[注意:*和+的详细信息请参见5.3和5.7,数组的详细信息参见8.3.4。--结束注释],但对于数组操作数,如果该操作数是左值,则结果为左值,否则为x值。

可以查找"C++5.2.1"或"C++[expr.sub]",但反转的使用并没有那么大,只是让那些看C或C++不够久的人感到困惑。