我使用的库具有重载[]运算符的自定义数据类型,以允许对名为MType
的数据进行类似数组的访问。
我已经创建了这些对象的实际数组,如下所示:MType mtypearray[3];
现在,在访问数据时,我不确定哪个索引用于什么。
mtypearray[a][b] = 5;
使用[] -overload或a
中声明的通常大小为3的数组,MType mtypearray[3];
是自定义MType的索引吗?
我的实验表明a
实际上是数组索引,b
用于自定义类型索引。但这似乎与你通常处理多维数组的方式相违背。
[]是否真的从左到右而不是从右到左进行评估?
答案 0 :(得分:5)
首先评估左方括号。
mtypearray[a]
返回MType&
。 mtypearray[a][b]
另外将下标运算符应用于MType&
。所以,你的作业相当于
MType& m = mtypearray[a];
m[b] = 5;
答案 1 :(得分:1)
是的,索引运算符是左关联的。在声明方面,这几乎是违反直觉的。比如,你有一个包含3个元素的数组:
int arr1D[3];
现在又希望有5个,再次在数组中。天真的人会想到
int arr2D[3][5]
会这样做,但实际上每个都会声明3个包含5个元素的一维数组,因为左边的索引将首先被评估。出于许多目的,只要程序相应地使用索引,这无关紧要。毕竟,这是15个整数,在记忆中是连续的。但正确的,有点不直观的方法是在“内部”添加额外的维度:
int arr2D[5][3]
这种关联性与一般直观规则一致,即从应用运算符的标识符的角度来看,关联性是由内而外的。前缀运算符是右关联的:
*(&(*a)))
虽然后缀运算符是左关联的。
( (a()) () ) ()
任何其他订单可能会令人惊讶。