C++反转索引器和数组的名称
C++ reversing indexer and name of array
我在网上看到了这个,想知道是否有人能解释一下,或者至少给我一个名字,这样我至少可以知道我在谷歌上搜索什么。
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))
,其中s
是sizeof 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++不够久的人感到困惑。
相关文章:
- 数组索引的值没有增加
- 并行用于C++17中数组索引范围内的循环
- 数组索引重载错误
- 通过指针与数组引用扩展数组索引序列
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 缓冲区溢出 - 数组索引越界(严重)
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 查找下一个具有真值C++的数组索引
- 在编译时自动生成用于稀疏数组索引的switch语句
- 在数组索引上引发异常
- C++ 将二维数组索引与条件语句中的函数值进行比较
- 平衡数组索引,同时从左和右对数组求和
- 为什么C ,Devstudio,数组索引工作
- 如何对同一数组索引下的结构成员进行排序?
- 我想返回数组索引,而不是数组值
- C++相当于 Python 的:用于数组索引
- 分段错误:为什么这里的数组索引越界了
- 数组索引在地图上不是整数
- 根据用户输入的每个字母添加到数组索引
- C 数组索引