对[]运算符的嵌套调用是从左到右评估的吗?

时间:2015-10-22 11:53:37

标签: c++ arrays indexing

我使用的库具有重载[]运算符的自定义数据类型,以允许对名为MType的数据进行类似数组的访问。

我已经创建了这些对象的实际数组,如下所示:MType mtypearray[3];

现在,在访问数据时,我不确定哪个索引用于什么。

mtypearray[a][b] = 5;

使用[] -overload或a中声明的通常大小为3的数组,MType mtypearray[3];是自定义MType的索引吗?

我的实验表明a实际上是数组索引,b用于自定义类型索引。但这似乎与你通常处理多维数组的方式相违背。

[]是否真的从左到右而不是从右到左进行评估?

2 个答案:

答案 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()) () ) ()

任何其他订单可能会令人惊讶。