奇怪的阵列签名

时间:2013-08-30 22:48:30

标签: c++ arrays reference

最近看到了以下代码:

int main()
{
    int a = 3;
    0[&a] = a+a;//What is this??? 
}

有人可以解释,这意味着什么?

2 个答案:

答案 0 :(得分:7)

这是一些丑陋的代码 - 但它完全合法(在C和C ++中)。

正如this questionthis popular answermy attempt to provide some historical context中所解释的那样。[]索引运算符是可交换的,所以

0[&a] = a+a;

相当于:

(&a)[0] = a+a;

&aint对象a的地址。索引运算符采用指针操作数和整数操作数。通常,指针是数组名称(或者等效地,在此上下文中,指向数组的第一个元素的指针)。但是,出于索引和指针算术的目的,单个对象可以被视为具有单个元素的数组。

之前的声明是:

int a = 3;

该作业将int对象a视为int的单元素数组,并引用该数组的元素0 - 恰好是唯一存在的元素。

a的先前值为3,因此a+a显然是6。

所以这个:

int a = 3;
0[&a] = a+a;

相当于:

int a = 3;
a = a + a;

相当于:

int a = 3;
a = 6;

最终相当于:

int a = 6;

在典型的专业软件工程环境中,有效等同于:

int a = 6; /* Please reject this submitted code and consider firing me. */

答案 1 :(得分:4)

C中的数组下标有点奇怪。该标准将E1[E2]定义为等同于*(E1+E2)。当然,加法是可交换的,所以这相当于*(E2+E1)。这相当于E2[E1] ...

考虑到这一点,你的第二行变为:

(&a)[0] = a+a;
您可能同意的

相当于:

*(&a) = a+a;

a = a+a;