C ++反向索引器和数组名称
这个问题在这里已经有了答案:
这是因为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。 除了在数组操作数的情况下,如果该操作数是左值,则结果是左值,否则是左值。
它可能会寻找“C ++ 5.2.1”或“C ++ [expr.sub]”,但是使用逆转并没有超出混淆C或C ++看起来不够长的人。
链接地址: http://www.djcxy.com/p/86739.html